define(function(require, exports, module) {
    var jQuery = require('jquery');
    (function() {
        function r(a, b) {
            var c;
            a || (a = {});
            for(c in b)
            a[c] = b[c];
            return a
        }

        function ka() {
            for(var a = 0, b = arguments, c = b.length, d = {}; a < c; a++)
            d[b[a++]] = b[a];
            return d
        }

        function w(a, b) {
            return parseInt(a, b || 10)
        }

        function la(a) {
            return typeof a === "string"
        }

        function X(a) {
            return typeof a === "object"
        }

        function Ha(a) {
            return Object.prototype.toString.call(a) === "[object Array]"
        }

        function Aa(a) {
            return typeof a === "number"
        }

        function ma(a) {
            return J.log(a) / J.LN10
        }

        function ba(a) {
            return J.pow(10, a)
        }

        function Ba(a, b) {
            for(var c = a.length; c--;)
            if(a[c] === b) {
                a.splice(c, 1);
                break
            }
        }

        function t(a) {
            return a !== x && a !== null
        }

        function z(a, b, c) {
            var d, e;
            if(la(b)) t(c) ? a.setAttribute(b, c) : a && a.getAttribute && (e = a.getAttribute(b));
            else if(t(b) && X(b)) for(d in b)
            a.setAttribute(d, b[d]);
            return e
        }

        function na(a) {
            return Ha(a) ? a : [a]
        }

        function o() {
            var a = arguments,
                b, c, d = a.length;
            for(b = 0; b < d; b++)
            if(c = a[b], typeof c !== "undefined" && c !== null) return c
        }

        function H(a, b) {
            if(Ca && b && b.opacity !== x) b.filter = "alpha(opacity=" + b.opacity * 100 + ")";
            r(a.style, b)
        }

        function Q(a, b, c, d, e) {
            a = C.createElement(a);
            b && r(a, b);
            e && H(a, {
                padding: 0,
                border: R,
                margin: 0
            });
            c && H(a, c);
            d && d.appendChild(a);
            return a
        }

        function ca(a, b) {
            var c = function() {};
            c.prototype = new a;
            r(c.prototype, b);
            return c
        }

        function Ia(a, b, c, d) {
            var e = M.lang,
                f = a;
            b === -1 ? (b = (a || 0).toString(), a = b.indexOf(".") > -1 ? b.split(".")[1].length : 0) : a = isNaN(b = L(b)) ? 2 : b;
            var b = a,
                c = c === void 0 ? e.decimalPoint : c,
                d = d === void 0 ? e.thousandsSep : d,
                e = f < 0 ? "-" : "",
                a = String(w(f = L(+f || 0).toFixed(b))),
                g = a.length > 3 ? a.length % 3 : 0;
            return e + (g ? a.substr(0, g) + d : "") + a.substr(g).replace(/(\d{3})(?=\d)/g, "$1" + d) + (b ? c + L(f - a).toFixed(b).slice(2) : "")
        }

        function sa(a, b) {
            return Array((b || 2) + 1 - String(a).length).join(0) + a
        }

        function hb(a, b, c, d) {
            var e, c = o(c, 1);
            e = a / c;
            b || (b = [1, 2, 2.5, 5, 10], d && d.allowDecimals === !1 && (c === 1 ? b = [1, 2, 5, 10] : c <= 0.1 && (b = [1 / c])));
            for(d = 0; d < b.length; d++)
            if(a = b[d], e <= (b[d] + (b[d + 1] || b[d])) / 2) break;
            a *= c;
            return a
        }

        function Nb(a, b) {
            var c = b || [
                [zb, [1, 2, 5, 10, 20, 25, 50, 100, 200, 500]],
                [ib, [1, 2, 5, 10, 15, 30]],
                [Ua, [1, 2, 5, 10, 15, 30]],
                [Ja, [1, 2, 3, 4, 6, 8, 12]],
                [oa, [1, 2]],
                [Va, [1, 2]],
                [Ka, [1, 2, 3, 4, 6]],
                [ta, null]
            ],
                d = c[c.length - 1],
                e = B[d[0]],
                f = d[1],
                g;
            for(g = 0; g < c.length; g++)
            if(d = c[g], e = B[d[0]], f = d[1], c[g + 1] && a <= (e * f[f.length - 1] + B[c[g + 1][0]]) / 2) break;
            e === B[ta] && a < 5 * e && (f = [1, 2, 5]);
            e === B[ta] && a < 5 * e && (f = [1, 2, 5]);
            c = hb(a / e, f);
            return {
                unitRange: e,
                count: c,
                unitName: d[0]
            }
        }

        function Ob(a, b, c, d) {
            var e = [],
                f = {},
                g = M.global.useUTC,
                h, i = new Date(b),
                b = a.unitRange,
                j = a.count;
            b >= B[ib] && (i.setMilliseconds(0), i.setSeconds(b >= B[Ua] ? 0 : j * T(i.getSeconds() / j)));
            if(b >= B[Ua]) i[Ab](b >= B[Ja] ? 0 : j * T(i[jb]() / j));
            if(b >= B[Ja]) i[Bb](b >= B[oa] ? 0 : j * T(i[kb]() / j));
            if(b >= B[oa]) i[lb](b >= B[Ka] ? 1 : j * T(i[La]() / j));
            b >= B[Ka] && (i[Cb](b >= B[ta] ? 0 : j * T(i[Wa]() / j)), h = i[Xa]());
            b >= B[ta] && (h -= h % j, i[Db](h));
            if(b === B[Va]) i[lb](i[La]() - i[mb]() + o(d, 1));
            d = 1;
            h = i[Xa]();
            for(var k = i.getTime(), l = i[Wa](), m = i[La](), i = g ? 0 : (864E5 + i.getTimezoneOffset() * 6E4) % 864E5; k < c;)
            e.push(k), b === B[ta] ? k = Ya(h + d * j, 0) : b === B[Ka] ? k = Ya(h, l + d * j) : !g && (b === B[oa] || b === B[Va]) ? k = Ya(h, l, m + d * j * (b === B[oa] ? 1 : 7)) : (k += b * j, b <= B[Ja] && k % B[oa] === i && (f[k] = oa)), d++;
            e.push(k);
            e.info = r(a, {
                higherRanks: f,
                totalRange: b * j
            });
            return e
        }

        function Eb() {
            this.symbol = this.color = 0
        }

        function Fb(a, b) {
            var c = a.length,
                d, e;
            for(e = 0; e < c; e++)
            a[e].ss_i = e;
            a.sort(function(a, c) {
                d = b(a, c);
                return d === 0 ? a.ss_i - c.ss_i : d
            });
            for(e = 0; e < c; e++)
            delete a[e].ss_i
        }

        function Ma(a) {
            for(var b = a.length, c = a[0]; b--;)
            a[b] < c && (c = a[b]);
            return c
        }

        function Da(a) {
            for(var b = a.length, c = a[0]; b--;)
            a[b] > c && (c = a[b]);
            return c
        }

        function Ea(a, b) {
            for(var c in a)
            a[c] && a[c] !== b && a[c].destroy && a[c].destroy(), delete a[c]
        }

        function Na(a) {
            Za || (Za = Q(ia));
            a && Za.appendChild(a);
            Za.innerHTML = ""
        }

        function $a(a, b) {
            var c = "Highcharts error #" + a + ": " + a;
            if(b) throw c;
            else K.console && console.log(c)
        }

        function ea(a) {
            return parseFloat(a.toPrecision(14))
        }

        function ua(a, b) {
            Oa = o(a, b.animation)
        }

        function Gb() {
            var a = M.global.useUTC,
                b = a ? "getUTC" : "get",
                c = a ? "setUTC" : "set";
            Ya = a ? Date.UTC : function(a, b, c, g, h, i) {
                return(new Date(a, b, o(c, 1), o(g, 0), o(h, 0), o(i, 0))).getTime()
            };
            jb = b + "Minutes";
            kb = b + "Hours";
            mb = b + "Day";
            La = b + "Date";
            Wa = b + "Month";
            Xa = b + "FullYear";
            Ab = c + "Minutes";
            Bb = c + "Hours";
            lb = c + "Date";
            Cb = c + "Month";
            Db = c + "FullYear"
        }

        function va() {}

        function Pa(a, b, c) {
            this.axis = a;
            this.pos = b;
            this.type = c || "";
            this.isNew = !0;
            c || this.addLabel()
        }

        function nb(a, b) {
            this.axis = a;
            if(b) this.options = b, this.id = b.id;
            return this
        }

        function Hb(a, b, c, d, e, f) {
            var g = a.chart.inverted;
            this.axis = a;
            this.isNegative = c;
            this.options = b;
            this.x = d;
            this.stack = e;
            this.percent = f === "percent";
            this.alignOptions = {
                align: b.align || (g ? c ? "left" : "right" : "center"),
                verticalAlign: b.verticalAlign || (g ? "middle" : c ? "bottom" : "top"),
                y: o(b.y, g ? 4 : c ? 14 : -6),
                x: o(b.x, g ? c ? -6 : 6 : 0)
            };
            this.textAlign = b.textAlign || (g ? c ? "right" : "left" : "center")
        }

        function ob() {
            this.init.apply(this, arguments)
        }

        function pb(a, b) {
            var c = b.borderWidth,
                d = b.style,
                e = w(d.padding);
            this.chart = a;
            this.options = b;
            this.crosshairs = [];
            this.now = {
                x: 0,
                y: 0
            };
            this.isHidden = !0;
            this.label = a.renderer.label("", 0, 0, b.shape, null, null, b.useHTML, null, "tooltip").attr({
                padding: e,
                fill: b.backgroundColor,
                "stroke-width": c,
                r: b.borderRadius,
                zIndex: 8
            }).css(d).css({
                padding: 0
            }).hide().add();
            U || this.label.shadow(b.shadow);
            this.shared = b.shared
        }

        function qb(a, b) {
            var c = U ? "" : b.chart.zoomType;
            this.zoomX = /x/.test(c);
            this.zoomY = /y/.test(c);
            this.options = b;
            this.chart = a;
            this.init(a, b.tooltip)
        }

        function rb(a) {
            this.init(a)
        }

        function sb(a, b) {
            var c, d = a.series;
            a.series = null;
            c = A(M, a);
            c.series = a.series = d;
            var d = c.chart,
                e = d.margin,
                e = X(e) ? e : [e, e, e, e];
            this.optionsMarginTop = o(d.marginTop, e[0]);
            this.optionsMarginRight = o(d.marginRight, e[1]);
            this.optionsMarginBottom = o(d.marginBottom, e[2]);
            this.optionsMarginLeft = o(d.marginLeft, e[3]);
            this.runChartClick = (e = d.events) && !! e.click;
            this.callback = b;
            this.isResizing = 0;
            this.options = c;
            this.axes = [];
            this.series = [];
            this.hasCartesianSeries = d.showAxes;
            this.init(e)
        }
        var x, C = document,
            K = window,
            J = Math,
            s = J.round,
            T = J.floor,
            wa = J.ceil,
            y = J.max,
            O = J.min,
            L = J.abs,
            V = J.cos,
            Y = J.sin,
            xa = J.PI,
            ab = xa * 2 / 360,
            Fa = navigator.userAgent,
            Ib = K.opera,
            Ca = /msie/i.test(Fa) && !Ib,
            Qa = C.documentMode === 8,
            tb = /AppleWebKit/.test(Fa),
            bb = /Firefox/.test(Fa),
            pa = "http://www.w3.org/2000/svg",
            Z = !! C.createElementNS && !! C.createElementNS(pa, "svg").createSVGRect,
            Pb = bb && parseInt(Fa.split("Firefox/")[1], 10) < 4,
            U = !Z && !Ca && !! C.createElement("canvas").getContext,
            Ra, fa = C.documentElement.ontouchstart !== x,
            Jb = {},
            ub = 0,
            Za, M, cb, Oa, vb, B, ya = function() {},
            ia = "div",
            R = "none",
            wb = "rgba(192,192,192," + (Z ? 1.0E-6 : 0.0020) + ")",
            zb = "millisecond",
            ib = "second",
            Ua = "minute",
            Ja = "hour",
            oa = "day",
            Va = "week",
            Ka = "month",
            ta = "year",
            Ya, jb, kb, mb, La, Wa, Xa, Ab, Bb, lb, Cb, Db, $ = {};
        K.Highcharts = {};
        cb = function(a, b, c) {
            if(!t(b) || isNaN(b)) return "Invalid date";
            var a = o(a, "%Y-%m-%d %H:%M:%S"),
                d = new Date(b),
                e, f = d[kb](),
                g = d[mb](),
                h = d[La](),
                i = d[Wa](),
                j = d[Xa](),
                k = M.lang,
                l = k.weekdays,
                b = {
                    a: l[g].substr(0, 3),
                    A: l[g],
                    d: sa(h),
                    e: h,
                    b: k.shortMonths[i],
                    B: k.months[i],
                    m: sa(i + 1),
                    y: j.toString().substr(2, 2),
                    Y: j,
                    H: sa(f),
                    I: sa(f % 12 || 12),
                    l: f % 12 || 12,
                    M: sa(d[jb]()),
                    p: f < 12 ? "AM" : "PM",
                    P: f < 12 ? "am" : "pm",
                    S: sa(d.getSeconds()),
                    L: sa(s(b % 1E3), 3)
                };
            for(e in b)
            a = a.replace("%" + e, b[e]);
            return c ? a.substr(0, 1).toUpperCase() + a.substr(1) : a
        };
        Eb.prototype = {
            wrapColor: function(a) {
                if(this.color >= a) this.color = 0
            },
            wrapSymbol: function(a) {
                if(this.symbol >= a) this.symbol = 0
            }
        };
        B = ka(zb, 1, ib, 1E3, Ua, 6E4, Ja, 36E5, oa, 864E5, Va, 6048E5, Ka, 2592E6, ta, 31556952E3);
        vb = {
            init: function(a, b, c) {
                var b = b || "",
                    d = a.shift,
                    e = b.indexOf("C") > -1,
                    f = e ? 7 : 3,
                    g, b = b.split(" "),
                    c = [].concat(c),
                    h, i, j = function(a) {
                        for(g = a.length; g--;)
                        a[g] === "M" && a.splice(g + 1, 0, a[g + 1], a[g + 2], a[g + 1], a[g + 2])
                    };
                e && (j(b), j(c));
                a.isArea && (h = b.splice(b.length - 6, 6), i = c.splice(c.length - 6, 6));
                if(d <= c.length / f) for(; d--;)
                c = [].concat(c).splice(0, f).concat(c);
                a.shift = 0;
                if(b.length) for(a = c.length; b.length < a;)
                d = [].concat(b).splice(b.length - f, f), e && (d[f - 6] = d[f - 2], d[f - 5] = d[f - 1]), b = b.concat(d);
                h && (b = b.concat(h), c = c.concat(i));
                return [b, c]
            },
            step: function(a, b, c, d) {
                var e = [],
                    f = a.length;
                if(c === 1) e = d;
                else if(f === b.length && c < 1) for(; f--;)
                d = parseFloat(a[f]), e[f] = isNaN(d) ? a[f] : c * parseFloat(b[f] - d) + d;
                else e = b;
                return e
            }
        };
        (function(a) {
            K.HighchartsAdapter = K.HighchartsAdapter || a && {
                init: function(b) {
                    var c = a.fx,
                        d = c.step,
                        e, f = a.Tween,
                        g = f && f.propHooks;
                    a.extend(a.easing, {
                        easeOutQuad: function(a, b, c, d, e) {
                            return -d * (b /= e) * (b - 2) + c
                        }
                    });
                    a.each(["cur", "_default", "width", "height"], function(a, b) {
                        var e = d,
                            k, l;
                        b === "cur" ? e = c.prototype : b === "_default" && f && (e = g[b], b = "set");
                        (k = e[b]) && (e[b] = function(c) {
                            c = a ? c : this;
                            l = c.elem;
                            return l.attr ? l.attr(c.prop, b === "cur" ? x : c.now) : k.apply(this, arguments)
                        })
                    });
                    e = function(a) {
                        var c = a.elem,
                            d;
                        if(!a.started) d = b.init(c, c.d, c.toD), a.start = d[0], a.end = d[1], a.started = !0;
                        c.attr("d", b.step(a.start, a.end, a.pos, c.toD))
                    };
                    f ? g.d = {
                        set: e
                    } : d.d = e;
                    this.each = Array.prototype.forEach ?
                    function(a, b) {
                        return Array.prototype.forEach.call(a, b)
                    } : function(a, b) {
                        for(var c = 0, d = a.length; c < d; c++)
                        if(b.call(a[c], a[c], c, a) === !1) return c
                    }
                },
                getScript: a.getScript,
                inArray: a.inArray,
                adapterRun: function(b, c) {
                    return a(b)[c]()
                },
                grep: a.grep,
                map: function(a, c) {
                    for(var d = [], e = 0, f = a.length; e < f; e++)
                    d[e] = c.call(a[e], a[e], e, a);
                    return d
                },
                merge: function() {
                    var b = arguments;
                    return a.extend(!0, null, b[0], b[1], b[2], b[3])
                },
                offset: function(b) {
                    return a(b).offset()
                },
                addEvent: function(b, c, d) {
                    a(b).bind(c, d)
                },
                removeEvent: function(b, c, d) {
                    var e = C.removeEventListener ? "removeEventListener" : "detachEvent";
                    C[e] && !b[e] && (b[e] = function() {});
                    a(b).unbind(c, d)
                },
                fireEvent: function(b, c, d, e) {
                    var f = a.Event(c),
                        g = "detached" + c,
                        h;
                    !Ca && d && (delete d.layerX, delete d.layerY);
                    r(f, d);
                    b[c] && (b[g] = b[c], b[c] = null);
                    a.each(["preventDefault", "stopPropagation"], function(a, b) {
                        var c = f[b];
                        f[b] = function() {
                            try {
                                c.call(f)
                            } catch(a) {
                                b === "preventDefault" && (h = !0)
                            }
                        }
                    });
                    a(b).trigger(f);
                    b[g] && (b[c] = b[g], b[g] = null);
                    e && !f.isDefaultPrevented() && !h && e(f)
                },
                washMouseEvent: function(a) {
                    var c = a.originalEvent || a;
                    if(c.pageX === x) c.pageX = a.pageX, c.pageY = a.pageY;
                    return c
                },
                animate: function(b, c, d) {
                    var e = a(b);
                    if(c.d) b.toD = c.d, c.d = 1;
                    e.stop();
                    e.animate(c, d)
                },
                stop: function(b) {
                    a(b).stop()
                }
            }
        })(jQuery);
        var ga = K.HighchartsAdapter,
            G = ga || {};
        ga && ga.init.call(ga, vb);
        var db = G.adapterRun,
            Qb = G.getScript,
            Rb = G.inArray,
            n = G.each,
            Kb = G.grep,
            Sb = G.offset,
            Sa = G.map,
            A = G.merge,
            I = G.addEvent,
            S = G.removeEvent,
            E = G.fireEvent,
            Lb = G.washMouseEvent,
            xb = G.animate,
            eb = G.stop,
            G = {
                enabled: !0,
                align: "center",
                x: 0,
                y: 15,
                style: {
                    color: "#666",
                    fontSize: "11px",
                    lineHeight: "14px"
                }
            };
        M = {
            colors: "#4572A7,#AA4643,#89A54E,#80699B,#3D96AE,#DB843D,#92A8CD,#A47D7C,#B5CA92".split(","),
            symbols: ["circle", "diamond", "square", "triangle", "triangle-down"],
            lang: {
                loading: "Loading...",
                months: "January,February,March,April,May,June,July,August,September,October,November,December".split(","),
                shortMonths: "Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec".split(","),
                weekdays: "Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday".split(","),
                decimalPoint: ".",
                numericSymbols: "k,M,G,T,P,E".split(","),
                resetZoom: "Reset zoom",
                resetZoomTitle: "Reset zoom level 1:1",
                thousandsSep: ","
            },
            global: {
                useUTC: !0,
                canvasToolsURL: "",
                VMLRadialGradientURL: ""
            },
            chart: {
                borderColor: "#4572A7",
                borderRadius: 5,
                defaultSeriesType: "line",
                ignoreHiddenSeries: !0,
                spacingTop: 10,
                spacingRight: 10,
                spacingBottom: 15,
                spacingLeft: 10,
                style: {
                    fontFamily: '"Lucida Grande", "Lucida Sans Unicode", Verdana, Arial, Helvetica, sans-serif',
                    fontSize: "12px"
                },
                backgroundColor: "#FFFFFF",
                plotBorderColor: "#C0C0C0",
                resetZoomButton: {
                    theme: {
                        zIndex: 20
                    },
                    position: {
                        align: "right",
                        x: -10,
                        y: 10
                    }
                }
            },
            title: {
                text: "Chart title",
                align: "center",
                y: 15,
                style: {
                    color: "#3E576F",
                    fontSize: "16px"
                }
            },
            subtitle: {
                text: "",
                align: "center",
                y: 30,
                style: {
                    color: "#6D869F"
                }
            },
            plotOptions: {
                line: {
                    allowPointSelect: !1,
                    showCheckbox: !1,
                    animation: {
                        duration: 1E3
                    },
                    events: {},
                    lineWidth: 2,
                    shadow: !0,
                    marker: {
                        enabled: !0,
                        lineWidth: 0,
                        radius: 4,
                        lineColor: "#FFFFFF",
                        states: {
                            hover: {
                                enabled: !0
                            },
                            select: {
                                fillColor: "#FFFFFF",
                                lineColor: "#000000",
                                lineWidth: 2
                            }
                        }
                    },
                    point: {
                        events: {}
                    },
                    dataLabels: A(G, {
                        enabled: !1,
                        formatter: function() {
                            return this.y
                        },
                        verticalAlign: "bottom",
                        y: 0
                    }),
                    cropThreshold: 300,
                    pointRange: 0,
                    showInLegend: !0,
                    states: {
                        hover: {
                            marker: {}
                        },
                        select: {
                            marker: {}
                        }
                    },
                    stickyTracking: !0
                }
            },
            labels: {
                style: {
                    position: "absolute",
                    color: "#3E576F"
                }
            },
            legend: {
                enabled: !0,
                align: "center",
                layout: "horizontal",
                labelFormatter: function() {
                    return this.name
                },
                borderWidth: 1,
                borderColor: "#909090",
                borderRadius: 5,
                navigation: {
                    activeColor: "#3E576F",
                    inactiveColor: "#CCC"
                },
                shadow: !1,
                itemStyle: {
                    cursor: "pointer",
                    color: "#3E576F",
                    fontSize: "12px"
                },
                itemHoverStyle: {
                    color: "#000"
                },
                itemHiddenStyle: {
                    color: "#CCC"
                },
                itemCheckboxStyle: {
                    position: "absolute",
                    width: "13px",
                    height: "13px"
                },
                symbolWidth: 16,
                symbolPadding: 5,
                verticalAlign: "bottom",
                x: 0,
                y: 0
            },
            loading: {
                labelStyle: {
                    fontWeight: "bold",
                    position: "relative",
                    top: "1em"
                },
                style: {
                    position: "absolute",
                    backgroundColor: "white",
                    opacity: 0.5,
                    textAlign: "center"
                }
            },
            tooltip: {
                enabled: !0,
                backgroundColor: "rgba(255, 255, 255, .85)",
                borderWidth: 2,
                borderRadius: 5,
                dateTimeLabelFormats: {
                    millisecond: "%A, %b %e, %H:%M:%S.%L",
                    second: "%A, %b %e, %H:%M:%S",
                    minute: "%A, %b %e, %H:%M",
                    hour: "%A, %b %e, %H:%M",
                    day: "%A, %b %e, %Y",
                    week: "Week from %A, %b %e, %Y",
                    month: "%B %Y",
                    year: "%Y"
                },
                headerFormat: '<span style="font-size: 10px">{point.key}</span><br/>',
                pointFormat: '<span style="color:{series.color}">{series.name}</span>: <b>{point.y}</b><br/>',
                shadow: !0,
                shared: U,
                snap: fa ? 25 : 10,
                style: {
                    color: "#333333",
                    fontSize: "12px",
                    padding: "5px",
                    whiteSpace: "nowrap"
                }
            },
            credits: {
                enabled: !0,
                text: "",
                href: "",
                position: {
                    align: "right",
                    x: -10,
                    verticalAlign: "bottom",
                    y: -5
                },
                style: {
                    cursor: "pointer",
                    color: "#909090",
                    fontSize: "10px"
                }
            }
        };
        var W = M.plotOptions,
            ga = W.line;
        Gb();
        var qa = function(a) {
                var b = [],
                    c;
                (function(a) {
                    (c = /rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]?(?:\.[0-9]+)?)\s*\)/.exec(a)) ? b = [w(c[1]), w(c[2]), w(c[3]), parseFloat(c[4], 10)] : (c = /#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(a)) && (b = [w(c[1], 16), w(c[2], 16), w(c[3], 16), 1])
                })(a);
                return {
                    get: function(c) {
                        return b && !isNaN(b[0]) ? c === "rgb" ? "rgb(" + b[0] + "," + b[1] + "," + b[2] + ")" : c === "a" ? b[3] : "rgba(" + b.join(",") + ")" : a
                    },
                    brighten: function(a) {
                        if(Aa(a) && a !== 0) {
                            var c;
                            for(c = 0; c < 3; c++)
                            b[c] += w(a * 255), b[c] < 0 && (b[c] = 0), b[c] > 255 && (b[c] = 255)
                        }
                        return this
                    },
                    setOpacity: function(a) {
                        b[3] = a;
                        return this
                    }
                }
            };
        va.prototype = {
            init: function(a, b) {
                this.element = b === "span" ? Q(b) : C.createElementNS(pa, b);
                this.renderer = a;
                this.attrSetters = {}
            },
            animate: function(a, b, c) {
                b = o(b, Oa, !0);
                eb(this);
                if(b) {
                    b = A(b);
                    if(c) b.complete = c;
                    xb(this, a, b)
                } else this.attr(a), c && c()
            },
            attr: function(a, b) {
                var c, d, e, f, g = this.element,
                    h = g.nodeName.toLowerCase(),
                    i = this.renderer,
                    j, k = this.attrSetters,
                    l = this.shadows,
                    m, p, u = this;
                la(a) && t(b) && (c = a, a = {}, a[c] = b);
                if(la(a)) c = a, h === "circle" ? c = {
                    x: "cx",
                    y: "cy"
                }[c] || c : c === "strokeWidth" && (c = "stroke-width"), u = z(g, c) || this[c] || 0, c !== "d" && c !== "visibility" && (u = parseFloat(u));
                else for(c in a)
                if(j = !1, d = a[c], e = k[c] && k[c].call(this, d, c), e !== !1) {
                    e !== x && (d = e);
                    if(c === "d") d && d.join && (d = d.join(" ")), /(NaN| {2}|^$)/.test(d) && (d = "M 0 0");
                    else if(c === "x" && h === "text") {
                        for(e = 0; e < g.childNodes.length; e++)
                        f = g.childNodes[e], z(f, "x") === z(g, "x") && z(f, "x", d);
                        this.rotation && z(g, "transform", "rotate(" + this.rotation + " " + d + " " + w(a.y || z(g, "y")) + ")")
                    } else if(c === "fill") d = i.color(d, g, c);
                    else if(h === "circle" && (c === "x" || c === "y")) c = {
                        x: "cx",
                        y: "cy"
                    }[c] || c;
                    else if(h === "rect" && c === "r") z(g, {
                        rx: d,
                        ry: d
                    }), j = !0;
                    else if(c === "translateX" || c === "translateY" || c === "rotation" || c === "verticalAlign") j = p = !0;
                    else if(c === "stroke") d = i.color(d, g, c);
                    else if(c === "dashstyle") if(c = "stroke-dasharray", d = d && d.toLowerCase(), d === "solid") d = R;
                    else {
                        if(d) {
                            d = d.replace("shortdashdotdot", "3,1,1,1,1,1,").replace("shortdashdot", "3,1,1,1").replace("shortdot", "1,1,").replace("shortdash", "3,1,").replace("longdash", "8,3,").replace(/dot/g, "1,3,").replace("dash", "4,3,").replace(/,$/, "").split(",");
                            for(e = d.length; e--;)
                            d[e] = w(d[e]) * a["stroke-width"];
                            d = d.join(",")
                        }
                    } else if(c === "isTracker") this[c] = d;
                    else if(c === "width") d = w(d);
                    else if(c === "align") c = "text-anchor", d = {
                        left: "start",
                        center: "middle",
                        right: "end"
                    }[d];
                    else if(c === "title") e = g.getElementsByTagName("title")[0], e || (e = C.createElementNS(pa, "title"), g.appendChild(e)), e.textContent = d;
                    c === "strokeWidth" && (c = "stroke-width");
                    tb && c === "stroke-width" && d === 0 && (d = 1.0E-6);
                    this.symbolName && /^(x|y|width|height|r|start|end|innerR|anchorX|anchorY)/.test(c) && (m || (this.symbolAttr(a), m = !0), j = !0);
                    if(l && /^(width|height|visibility|x|y|d|transform)$/.test(c)) for(e = l.length; e--;)
                    z(l[e], c, c === "height" ? y(d - (l[e].cutHeight || 0), 0) : d);
                    if((c === "width" || c === "height") && h === "rect" && d < 0) d = 0;
                    this[c] = d;
                    p && this.updateTransform();
                    c === "text" ? (d !== this.textStr && delete this.bBox, this.textStr = d, this.added && i.buildText(this)) : j || z(g, c, d)
                }
                return u
            },
            symbolAttr: function(a) {
                var b = this;
                n("x,y,r,start,end,width,height,innerR,anchorX,anchorY".split(","), function(c) {
                    b[c] = o(a[c], b[c])
                });
                b.attr({
                    d: b.renderer.symbols[b.symbolName](b.x, b.y, b.width, b.height, b)
                })
            },
            clip: function(a) {
                return this.attr("clip-path", a ? "url(" + this.renderer.url + "#" + a.id + ")" : R)
            },
            crisp: function(a, b, c, d, e) {
                var f, g = {},
                    h = {},
                    i, a = a || this.strokeWidth || this.attr && this.attr("stroke-width") || 0;
                i = s(a) % 2 / 2;
                h.x = T(b || this.x || 0) + i;
                h.y = T(c || this.y || 0) + i;
                h.width = T((d || this.width || 0) - 2 * i);
                h.height = T((e || this.height || 0) - 2 * i);
                h.strokeWidth = a;
                for(f in h)
                this[f] !== h[f] && (this[f] = g[f] = h[f]);
                return g
            },
            css: function(a) {
                var b = this.element,
                    b = a && a.width && b.nodeName.toLowerCase() === "text",
                    c, d = "",
                    e = function(a, b) {
                        return "-" + b.toLowerCase()
                    };
                if(a && a.color) a.fill = a.color;
                this.styles = a = r(this.styles, a);
                U && b && delete a.width;
                if(Ca && !Z) b && delete a.width, H(this.element, a);
                else {
                    for(c in a)
                    d += c.replace(/([A-Z])/g, e) + ":" + a[c] + ";";
                    this.attr({
                        style: d
                    })
                }
                b && this.added && this.renderer.buildText(this);
                return this
            },
            on: function(a, b) {
                var c = b;
                fa && a === "click" && (a = "touchstart", c = function(a) {
                    a.preventDefault();
                    b()
                });
                this.element["on" + a] = c;
                return this
            },
            setRadialReference: function(a) {
                this.element.radialReference = a;
                return this
            },
            translate: function(a, b) {
                return this.attr({
                    translateX: a,
                    translateY: b
                })
            },
            invert: function() {
                this.inverted = !0;
                this.updateTransform();
                return this
            },
            htmlCss: function(a) {
                var b = this.element;
                if(b = a && b.tagName === "SPAN" && a.width) delete a.width, this.textWidth = b, this.updateTransform();
                this.styles = r(this.styles, a);
                H(this.element, a);
                return this
            },
            htmlGetBBox: function() {
                var a = this.element,
                    b = this.bBox;
                if(!b) {
                    if(a.nodeName === "text") a.style.position = "absolute";
                    b = this.bBox = {
                        x: a.offsetLeft,
                        y: a.offsetTop,
                        width: a.offsetWidth,
                        height: a.offsetHeight
                    }
                }
                return b
            },
            htmlUpdateTransform: function() {
                if(this.added) {
                    var a = this.renderer,
                        b = this.element,
                        c = this.translateX || 0,
                        d = this.translateY || 0,
                        e = this.x || 0,
                        f = this.y || 0,
                        g = this.textAlign || "left",
                        h = {
                            left: 0,
                            center: 0.5,
                            right: 1
                        }[g],
                        i = g && g !== "left",
                        j = this.shadows;
                    if(c || d) H(b, {
                        marginLeft: c,
                        marginTop: d
                    }), j && n(j, function(a) {
                        H(a, {
                            marginLeft: c + 1,
                            marginTop: d + 1
                        })
                    });
                    this.inverted && n(b.childNodes, function(c) {
                        a.invertChild(c, b)
                    });
                    if(b.tagName === "SPAN") {
                        var k, l, j = this.rotation,
                            m, p = 0,
                            u = 1,
                            p = 0,
                            da;
                        m = w(this.textWidth);
                        var q = this.xCorr || 0,
                            D = this.yCorr || 0,
                            aa = [j, g, b.innerHTML, this.textWidth].join(",");
                        k = {};
                        if(aa !== this.cTT) {
                            if(t(j)) a.isSVG ? (q = Ca ? "-ms-transform" : tb ? "-webkit-transform" : bb ? "MozTransform" : Ib ? "-o-transform" : "", k[q] = k.transform = "rotate(" + j + "deg)") : (p = j * ab, u = V(p), p = Y(p), k.filter = j ? ["progid:DXImageTransform.Microsoft.Matrix(M11=", u, ", M12=", -p, ", M21=", p, ", M22=", u, ", sizingMethod='auto expand')"].join("") : R), H(b, k);
                            k = o(this.elemWidth, b.offsetWidth);
                            l = o(this.elemHeight, b.offsetHeight);
                            k > m && /[ \-]/.test(b.innerText) && (H(b, {
                                width: m + "px",
                                display: "block",
                                whiteSpace: "normal"
                            }), k = m);
                            m = a.fontMetrics(b.style.fontSize).b;
                            q = u < 0 && -k;
                            D = p < 0 && -l;
                            da = u * p < 0;
                            q += p * m * (da ? 1 - h : h);
                            D -= u * m * (j ? da ? h : 1 - h : 1);
                            i && (q -= k * h * (u < 0 ? -1 : 1), j && (D -= l * h * (p < 0 ? -1 : 1)), H(b, {
                                textAlign: g
                            }));
                            this.xCorr = q;
                            this.yCorr = D
                        }
                        H(b, {
                            left: e + q + "px",
                            top: f + D + "px"
                        });
                        this.cTT = aa
                    }
                } else this.alignOnAdd = !0
            },
            updateTransform: function() {
                var a = this.translateX || 0,
                    b = this.translateY || 0,
                    c = this.inverted,
                    d = this.rotation,
                    e = [];
                c && (a += this.attr("width"), b += this.attr("height"));
                (a || b) && e.push("translate(" + a + "," + b + ")");
                c ? e.push("rotate(90) scale(-1,1)") : d && e.push("rotate(" + d + " " + (this.x || 0) + " " + (this.y || 0) + ")");
                e.length && z(this.element, "transform", e.join(" "))
            },
            toFront: function() {
                var a = this.element;
                a.parentNode.appendChild(a);
                return this
            },
            align: function(a, b, c) {
                a ? (this.alignOptions = a, this.alignByTranslate = b, c || this.renderer.alignedObjects.push(this)) : (a = this.alignOptions, b = this.alignByTranslate);
                var c = o(c, this.renderer),
                    d = a.align,
                    e = a.verticalAlign,
                    f = (c.x || 0) + (a.x || 0),
                    g = (c.y || 0) + (a.y || 0),
                    h = {};
                if(d === "right" || d === "center") f += (c.width - (a.width || 0)) / {
                    right: 1,
                    center: 2
                }[d];
                h[b ? "translateX" : "x"] = s(f);
                if(e === "bottom" || e === "middle") g += (c.height - (a.height || 0)) / ({
                    bottom: 1,
                    middle: 2
                }[e] || 1);
                h[b ? "translateY" : "y"] = s(g);
                this[this.placed ? "animate" : "attr"](h);
                this.placed = !0;
                this.alignAttr = h;
                return this
            },
            getBBox: function() {
                var a = this.bBox,
                    b = this.renderer,
                    c, d = this.rotation,
                    e = this.element,
                    f = this.styles,
                    g = d * ab;
                if(!a) {
                    if(e.namespaceURI === pa || b.forExport) {
                        try {
                            a = e.getBBox ? r({}, e.getBBox()) : {
                                width: e.offsetWidth,
                                height: e.offsetHeight
                            }
                        } catch(h) {}
                        if(!a || a.width < 0) a = {
                            width: 0,
                            height: 0
                        }
                    } else a = this.htmlGetBBox();
                    if(b.isSVG && (b = a.width, c = a.height, d)) a.width = L(c * Y(g)) + L(b * V(g)), a.height = L(c * V(g)) + L(b * Y(g));
                    if(Ca && f && f.fontSize === "11px" && c === 22.700000762939453) a.height = 14;
                    this.bBox = a
                }
                return a
            },
            show: function() {
                return this.attr({
                    visibility: "visible"
                })
            },
            hide: function() {
                return this.attr({
                    visibility: "hidden"
                })
            },
            add: function(a) {
                var b = this.renderer,
                    c = a || b,
                    d = c.element || b.box,
                    e = d.childNodes,
                    f = this.element,
                    g = z(f, "zIndex"),
                    h;
                if(a) this.parentGroup = a;
                this.parentInverted = a && a.inverted;
                this.textStr !== void 0 && b.buildText(this);
                if(g) c.handleZ = !0, g = w(g);
                if(c.handleZ) for(c = 0; c < e.length; c++)
                if(a = e[c], b = z(a, "zIndex"), a !== f && (w(b) > g || !t(g) && t(b))) {
                    d.insertBefore(f, a);
                    h = !0;
                    break
                }
                h || d.appendChild(f);
                this.added = !0;
                E(this, "add");
                return this
            },
            safeRemoveChild: function(a) {
                var b = a.parentNode;
                b && b.removeChild(a)
            },
            destroy: function() {
                var a = this,
                    b = a.element || {},
                    c = a.shadows,
                    d, e;
                b.onclick = b.onmouseout = b.onmouseover = b.onmousemove = null;
                eb(a);
                if(a.clipPath) a.clipPath = a.clipPath.destroy();
                if(a.stops) {
                    for(e = 0; e < a.stops.length; e++)
                    a.stops[e] = a.stops[e].destroy();
                    a.stops = null
                }
                a.safeRemoveChild(b);
                c && n(c, function(b) {
                    a.safeRemoveChild(b)
                });
                Ba(a.renderer.alignedObjects, a);
                for(d in a)
                delete a[d];
                return null
            },
            empty: function() {
                for(var a = this.element, b = a.childNodes, c = b.length; c--;)
                a.removeChild(b[c])
            },
            shadow: function(a, b, c) {
                var d = [],
                    e, f, g = this.element,
                    h, i, j, k;
                if(a) {
                    i = o(a.width, 3);
                    j = (a.opacity || 0.15) / i;
                    k = this.parentInverted ? "(-1,-1)" : "(" + o(a.offsetX, 1) + ", " + o(a.offsetY, 1) + ")";
                    for(e = 1; e <= i; e++) {
                        f = g.cloneNode(0);
                        h = i * 2 + 1 - 2 * e;
                        z(f, {
                            isShadow: "true",
                            stroke: a.color || "black",
                            "stroke-opacity": j * e,
                            "stroke-width": h,
                            transform: "translate" + k,
                            fill: R
                        });
                        if(c) z(f, "height", y(z(f, "height") - h, 0)), f.cutHeight = h;
                        b ? b.element.appendChild(f) : g.parentNode.insertBefore(f, g);
                        d.push(f)
                    }
                    this.shadows = d
                }
                return this
            }
        };
        var ra = function() {
                this.init.apply(this, arguments)
            };
        ra.prototype = {
            Element: va,
            init: function(a, b, c, d) {
                var e = location,
                    f;
                f = this.createElement("svg").attr({
                    xmlns: pa,
                    version: "1.1"
                });
                a.appendChild(f.element);
                this.isSVG = !0;
                this.box = f.element;
                this.boxWrapper = f;
                this.alignedObjects = [];
                this.url = (bb || tb) && C.getElementsByTagName("base").length ? e.href.replace(/#.*?$/, "").replace(/([\('\)])/g, "\\$1").replace(/ /g, "%20") : "";
                this.defs = this.createElement("defs").add();
                this.forExport = d;
                this.gradients = {};
                this.setSize(b, c, !1);
                var g;
                if(bb && a.getBoundingClientRect) this.subPixelFix = b = function() {
                    H(a, {
                        left: 0,
                        top: 0
                    });
                    g = a.getBoundingClientRect();
                    H(a, {
                        left: wa(g.left) - g.left + "px",
                        top: wa(g.top) - g.top + "px"
                    })
                }, b(), I(K, "resize", b)
            },
            isHidden: function() {
                return !this.boxWrapper.getBBox().width
            },
            destroy: function() {
                var a = this.defs;
                this.box = null;
                this.boxWrapper = this.boxWrapper.destroy();
                Ea(this.gradients || {});
                this.gradients = null;
                if(a) this.defs = a.destroy();
                this.subPixelFix && S(K, "resize", this.subPixelFix);
                return this.alignedObjects = null
            },
            createElement: function(a) {
                var b = new this.Element;
                b.init(this, a);
                return b
            },
            draw: function() {},
            buildText: function(a) {
                for(var b = a.element, c = o(a.textStr, "").toString().replace(/<(b|strong)>/g, '<span style="font-weight:bold">').replace(/<(i|em)>/g, '<span style="font-style:italic">').replace(/<a/g, "<span").replace(/<\/(b|strong|i|em|a)>/g, "</span>").split(/<br.*?>/g), d = b.childNodes, e = /style="([^"]+)"/, f = /href="([^"]+)"/, g = z(b, "x"), h = a.styles, i = h && h.width && w(h.width), j = h && h.lineHeight, k, h = d.length, l = []; h--;)
                b.removeChild(d[h]);
                i && !a.added && this.box.appendChild(b);
                c[c.length - 1] === "" && c.pop();
                n(c, function(c, d) {
                    var h, da = 0,
                        q, c = c.replace(/<span/g, "|||<span").replace(/<\/span>/g, "</span>|||");
                    h = c.split("|||");
                    n(h, function(c) {
                        if(c !== "" || h.length === 1) {
                            var m = {},
                                o = C.createElementNS(pa, "tspan"),
                                n;
                            e.test(c) && (n = c.match(e)[1].replace(/(;| |^)color([ :])/, "$1fill$2"), z(o, "style", n));
                            f.test(c) && (z(o, "onclick", 'location.href="' + c.match(f)[1] + '"'), H(o, {
                                cursor: "pointer"
                            }));
                            c = (c.replace(/<(.|\n)*?>/g, "") || " ").replace(/&lt;/g, "<").replace(/&gt;/g, ">");
                            o.appendChild(C.createTextNode(c));
                            da ? m.dx = 3 : m.x = g;
                            if(!da) {
                                if(d) {
                                    !Z && a.renderer.forExport && H(o, {
                                        display: "block"
                                    });
                                    q = K.getComputedStyle && w(K.getComputedStyle(k, null).getPropertyValue("line-height"));
                                    if(!q || isNaN(q)) {
                                        var F;
                                        if(!(F = j)) if(!(F = k.offsetHeight)) l[d] = b.getBBox ? b.getBBox().height : a.renderer.fontMetrics(b.style.fontSize).h, F = s(l[d] - (l[d - 1] || 0)) || 18;
                                        q = F
                                    }
                                    z(o, "dy", q)
                                }
                                k = o
                            }
                            z(o, m);
                            b.appendChild(o);
                            da++;
                            if(i) for(var c = c.replace(/([^\^])-/g, "$1- ").split(" "), t = []; c.length || t.length;)
                            delete a.bBox, F = a.getBBox().width, m = F > i, !m || c.length === 1 ? (c = t, t = [], c.length && (o = C.createElementNS(pa, "tspan"), z(o, {
                                dy: j || 16,
                                x: g
                            }), n && z(o, "style", n), b.appendChild(o), F > i && (i = F))) : (o.removeChild(o.firstChild), t.unshift(c.pop())), c.length && o.appendChild(C.createTextNode(c.join(" ").replace(/- /g, "-")))
                        }
                    })
                })
            },
            button: function(a, b, c, d, e, f, g) {
                var h = this.label(a, b, c),
                    i = 0,
                    j, k, l, m, p, a = {
                        x1: 0,
                        y1: 0,
                        x2: 0,
                        y2: 1
                    },
                    e = A(ka("stroke-width", 1, "stroke", "#999", "fill", ka("linearGradient", a, "stops", [
                        [0, "#FFF"],
                        [1, "#DDD"]
                    ]), "r", 3, "padding", 3, "style", ka("color", "black")), e);
                l = e.style;
                delete e.style;
                f = A(e, ka("stroke", "#68A", "fill", ka("linearGradient", a, "stops", [
                    [0, "#FFF"],
                    [1, "#ACF"]
                ])), f);
                m = f.style;
                delete f.style;
                g = A(e, ka("stroke", "#68A", "fill", ka("linearGradient", a, "stops", [
                    [0, "#9BD"],
                    [1, "#CDF"]
                ])), g);
                p = g.style;
                delete g.style;
                I(h.element, "mouseenter", function() {
                    h.attr(f).css(m)
                });
                I(h.element, "mouseleave", function() {
                    j = [e, f, g][i];
                    k = [l, m, p][i];
                    h.attr(j).css(k)
                });
                h.setState = function(a) {
                    (i = a) ? a === 2 && h.attr(g).css(p) : h.attr(e).css(l)
                };
                return h.on("click", function() {
                    d.call(h)
                }).attr(e).css(r({
                    cursor: "default"
                }, l))
            },
            crispLine: function(a, b) {
                a[1] === a[4] && (a[1] = a[4] = s(a[1]) - b % 2 / 2);
                a[2] === a[5] && (a[2] = a[5] = s(a[2]) + b % 2 / 2);
                return a
            },
            path: function(a) {
                var b = {
                    fill: R
                };
                Ha(a) ? b.d = a : X(a) && r(b, a);
                return this.createElement("path").attr(b)
            },
            circle: function(a, b, c) {
                a = X(a) ? a : {
                    x: a,
                    y: b,
                    r: c
                };
                return this.createElement("circle").attr(a)
            },
            arc: function(a, b, c, d, e, f) {
                if(X(a)) b = a.y, c = a.r, d = a.innerR, e = a.start, f = a.end, a = a.x;
                return this.symbol("arc", a || 0, b || 0, c || 0, c || 0, {
                    innerR: d || 0,
                    start: e || 0,
                    end: f || 0
                })
            },
            rect: function(a, b, c, d, e, f) {
                e = X(a) ? a.r : e;
                e = this.createElement("rect").attr({
                    rx: e,
                    ry: e,
                    fill: R
                });
                return e.attr(X(a) ? a : e.crisp(f, a, b, y(c, 0), y(d, 0)))
            },
            setSize: function(a, b, c) {
                var d = this.alignedObjects,
                    e = d.length;
                this.width = a;
                this.height = b;
                for(this.boxWrapper[o(c, !0) ? "animate" : "attr"]({
                    width: a,
                    height: b
                }); e--;)
                d[e].align()
            },
            g: function(a) {
                var b = this.createElement("g");
                return t(a) ? b.attr({
                    "class": "highcharts-" + a
                }) : b
            },
            image: function(a, b, c, d, e) {
                var f = {
                    preserveAspectRatio: R
                };
                arguments.length > 1 && r(f, {
                    x: b,
                    y: c,
                    width: d,
                    height: e
                });
                f = this.createElement("image").attr(f);
                f.element.setAttributeNS ? f.element.setAttributeNS("http://www.w3.org/1999/xlink", "href", a) : f.element.setAttribute("hc-svg-href", a);
                return f
            },
            symbol: function(a, b, c, d, e, f) {
                var g, h = this.symbols[a],
                    h = h && h(s(b), s(c), d, e, f),
                    i = /^url\((.*?)\)$/,
                    j, k;
                h ? (g = this.path(h), r(g, {
                    symbolName: a,
                    x: b,
                    y: c,
                    width: d,
                    height: e
                }), f && r(g, f)) : i.test(a) && (k = function(a, b) {
                    a.attr({
                        width: b[0],
                        height: b[1]
                    });
                    a.alignByTranslate || a.translate(-s(b[0] / 2), -s(b[1] / 2))
                }, j = a.match(i)[1], a = Jb[j], g = this.image(j).attr({
                    x: b,
                    y: c
                }), a ? k(g, a) : (g.attr({
                    width: 0,
                    height: 0
                }), Q("img", {
                    onload: function() {
                        k(g, Jb[j] = [this.width, this.height])
                    },
                    src: j
                })));
                return g
            },
            symbols: {
                circle: function(a, b, c, d) {
                    var e = 0.166 * c;
                    return ["M", a + c / 2, b, "C", a + c + e, b, a + c + e, b + d, a + c / 2, b + d, "C", a - e, b + d, a - e, b, a + c / 2, b, "Z"]
                },
                square: function(a, b, c, d) {
                    return ["M", a, b, "L", a + c, b, a + c, b + d, a, b + d, "Z"]
                },
                triangle: function(a, b, c, d) {
                    return ["M", a + c / 2, b, "L", a + c, b + d, a, b + d, "Z"]
                },
                "triangle-down": function(a, b, c, d) {
                    return ["M", a, b, "L", a + c, b, a + c / 2, b + d, "Z"]
                },
                diamond: function(a, b, c, d) {
                    return ["M", a + c / 2, b, "L", a + c, b + d / 2, a + c / 2, b + d, a, b + d / 2, "Z"]
                },
                arc: function(a, b, c, d, e) {
                    var f = e.start,
                        c = e.r || c || d,
                        g = e.end - 1.0E-6,
                        d = e.innerR,
                        h = e.open,
                        i = V(f),
                        j = Y(f),
                        k = V(g),
                        g = Y(g),
                        e = e.end - f < xa ? 0 : 1;
                    return ["M", a + c * i, b + c * j, "A", c, c, 0, e, 1, a + c * k, b + c * g, h ? "M" : "L", a + d * k, b + d * g, "A", d, d, 0, e, 0, a + d * i, b + d * j, h ? "" : "Z"]
                }
            },
            clipRect: function(a, b, c, d) {
                var e = "highcharts-" + ub++,
                    f = this.createElement("clipPath").attr({
                        id: e
                    }).add(this.defs),
                    a = this.rect(a, b, c, d, 0).add(f);
                a.id = e;
                a.clipPath = f;
                return a
            },
            color: function(a, b, c) {
                var d = this,
                    e, f = /^rgba/,
                    g;
                a && a.linearGradient ? g = "linearGradient" : a && a.radialGradient && (g = "radialGradient");
                if(g) {
                    var c = a[g],
                        h = d.gradients,
                        i, j, k, b = b.radialReference;
                    if(!c.id || !h[c.id]) Ha(c) && (a[g] = c = {
                        x1: c[0],
                        y1: c[1],
                        x2: c[2],
                        y2: c[3],
                        gradientUnits: "userSpaceOnUse"
                    }), g === "radialGradient" && b && !t(c.gradientUnits) && r(c, {
                        cx: b[0] - b[2] / 2 + c.cx * b[2],
                        cy: b[1] - b[2] / 2 + c.cy * b[2],
                        r: c.r * b[2],
                        gradientUnits: "userSpaceOnUse"
                    }), c.id = "highcharts-" + ub++, h[c.id] = i = d.createElement(g).attr(c).add(d.defs), i.stops = [], n(a.stops, function(a) {
                        f.test(a[1]) ? (e = qa(a[1]), j = e.get("rgb"), k = e.get("a")) : (j = a[1], k = 1);
                        a = d.createElement("stop").attr({
                            offset: a[0],
                            "stop-color": j,
                            "stop-opacity": k
                        }).add(i);
                        i.stops.push(a)
                    });
                    return "url(" + d.url + "#" + c.id + ")"
                } else return f.test(a) ? (e = qa(a), z(b, c + "-opacity", e.get("a")), e.get("rgb")) : (b.removeAttribute(c + "-opacity"), a)
            },
            text: function(a, b, c, d) {
                var e = M.chart.style,
                    f = U || !Z && this.forExport;
                if(d && !this.forExport) return this.html(a, b, c);
                b = s(o(b, 0));
                c = s(o(c, 0));
                a = this.createElement("text").attr({
                    x: b,
                    y: c,
                    text: a
                }).css({
                    fontFamily: e.fontFamily,
                    fontSize: e.fontSize
                });
                f && a.css({
                    position: "absolute"
                });
                a.x = b;
                a.y = c;
                return a
            },
            html: function(a, b, c) {
                var d = M.chart.style,
                    e = this.createElement("span"),
                    f = e.attrSetters,
                    g = e.element,
                    h = e.renderer;
                f.text = function(a) {
                    a !== g.innerHTML && delete this.bBox;
                    g.innerHTML = a;
                    return !1
                };
                f.x = f.y = f.align = function(a, b) {
                    b === "align" && (b = "textAlign");
                    e[b] = a;
                    e.htmlUpdateTransform();
                    return !1
                };
                e.attr({
                    text: a,
                    x: s(b),
                    y: s(c)
                }).css({
                    position: "absolute",
                    whiteSpace: "nowrap",
                    fontFamily: d.fontFamily,
                    fontSize: d.fontSize
                });
                e.css = e.htmlCss;
                if(h.isSVG) e.add = function(a) {
                    var b, c = h.box.parentNode,
                        d = [];
                    if(a) {
                        if(b = a.div, !b) {
                            for(; a;)
                            d.push(a), a = a.parentGroup;
                            n(d.reverse(), function(a) {
                                var d;
                                b = a.div = a.div || Q(ia, {
                                    cNameName: z(a.element, "class")
                                }, {
                                    position: "absolute",
                                    left: (a.translateX || 0) + "px",
                                    top: (a.translateY || 0) + "px"
                                }, b || c);
                                d = b.style;
                                r(a.attrSetters, {
                                    translateX: function(a) {
                                        d.left = a + "px"
                                    },
                                    translateY: function(a) {
                                        d.top = a + "px"
                                    },
                                    visibility: function(a, b) {
                                        d[b] = a
                                    }
                                })
                            })
                        }
                    } else b = c;
                    b.appendChild(g);
                    e.added = !0;
                    e.alignOnAdd && e.htmlUpdateTransform();
                    return e
                };
                return e
            },
            fontMetrics: function(a) {
                var a = w(a || 11),
                    a = a < 24 ? a + 4 : s(a * 1.2),
                    b = s(a * 0.8);
                return {
                    h: a,
                    b: b
                }
            },
            label: function(a, b, c, d, e, f, g, h, i) {
                function j() {
                    var a = p.styles,
                        a = a && a.textAlign,
                        b = aa * (1 - D),
                        c;
                    c = h ? 0 : yb;
                    if(t(Ga) && (a === "center" || a === "right")) b += {
                        center: 0.5,
                        right: 1
                    }[a] * (Ga - q.width);
                    (b !== u.x || c !== u.y) && u.attr({
                        x: b,
                        y: c
                    });
                    u.x = b;
                    u.y = c
                }

                function k(a, b) {
                    o ? o.attr(a, b) : fb[a] = b
                }

                function l() {
                    u.add(p);
                    p.attr({
                        text: a,
                        x: b,
                        y: c
                    });
                    t(e) && p.attr({
                        anchorX: e,
                        anchorY: f
                    })
                }
                var m = this,
                    p = m.g(i),
                    u = m.text("", 0, 0, g).attr({
                        zIndex: 1
                    }),
                    o, q, D = 0,
                    aa = 3,
                    Ga, v, F, y, P = 0,
                    fb = {},
                    yb, g = p.attrSetters;
                I(p, "add", l);
                g.width = function(a) {
                    Ga = a;
                    return !1
                };
                g.height = function(a) {
                    v = a;
                    return !1
                };
                g.padding = function(a) {
                    t(a) && a !== aa && (aa = a, j());
                    return !1
                };
                g.align = function(a) {
                    D = {
                        left: 0,
                        center: 0.5,
                        right: 1
                    }[a];
                    return !1
                };
                g.text = function(a, b) {
                    u.attr(b, a);
                    var c;
                    c = u.element.style;
                    q = (Ga === void 0 || v === void 0 || p.styles.textAlign) && u.getBBox();
                    p.width = (Ga || q.width || 0) + 2 * aa;
                    p.height = (v || q.height || 0) + 2 * aa;
                    yb = aa + m.fontMetrics(c && c.fontSize).b;
                    if(!o) c = h ? -yb : 0, p.box = o = d ? m.symbol(d, -D * aa, c, p.width, p.height) : m.rect(-D * aa, c, p.width, p.height, 0, fb["stroke-width"]), o.add(p);
                    o.attr(A({
                        width: p.width,
                        height: p.height
                    }, fb));
                    fb = null;
                    j();
                    return !1
                };
                g["stroke-width"] = function(a, b) {
                    P = a % 2 / 2;
                    k(b, a);
                    return !1
                };
                g.stroke = g.fill = g.r = function(a, b) {
                    k(b, a);
                    return !1
                };
                g.anchorX = function(a, b) {
                    e = a;
                    k(b, a + P - F);
                    return !1
                };
                g.anchorY = function(a, b) {
                    f = a;
                    k(b, a - y);
                    return !1
                };
                g.x = function(a) {
                    p.x = a;
                    a -= D * ((Ga || q.width) + aa);
                    F = s(a);
                    p.attr("translateX", F);
                    return !1
                };
                g.y = function(a) {
                    y = p.y = s(a);
                    p.attr("translateY", a);
                    return !1
                };
                var w = p.css;
                return r(p, {
                    css: function(a) {
                        if(a) {
                            var b = {},
                                a = A({}, a);
                            n("fontSize,fontWeight,fontFamily,color,lineHeight,width".split(","), function(c) {
                                a[c] !== x && (b[c] = a[c], delete a[c])
                            });
                            u.css(b)
                        }
                        return w.call(p, a)
                    },
                    getBBox: function() {
                        return o.getBBox()
                    },
                    shadow: function(a) {
                        o.shadow(a);
                        return p
                    },
                    destroy: function() {
                        S(p, "add", l);
                        S(p.element, "mouseenter");
                        S(p.element, "mouseleave");
                        u && (u = u.destroy());
                        o && (o = o.destroy());
                        va.prototype.destroy.call(p)
                    }
                })
            }
        };
        Ra = ra;
        var ja;
        if(!Z && !U) {
            ja = {
                init: function(a, b) {
                    var c = ["<", b, ' filled="f" stroked="f"'],
                        d = ["position: ", "absolute", ";"];
                    (b === "shape" || b === ia) && d.push("left:0;top:0;width:1px;height:1px;");
                    Qa && d.push("visibility: ", b === ia ? "hidden" : "visible");
                    c.push(' style="', d.join(""), '"/>');
                    if(b) c = b === ia || b === "span" || b === "img" ? c.join("") : a.prepVML(c), this.element = Q(c);
                    this.renderer = a;
                    this.attrSetters = {}
                },
                add: function(a) {
                    var b = this.renderer,
                        c = this.element,
                        d = b.box,
                        d = a ? a.element || a : d;
                    a && a.inverted && b.invertChild(c, d);
                    d.appendChild(c);
                    this.added = !0;
                    this.alignOnAdd && !this.deferUpdateTransform && this.updateTransform();
                    E(this, "add");
                    return this
                },
                updateTransform: va.prototype.htmlUpdateTransform,
                attr: function(a, b) {
                    var c, d, e, f = this.element || {},
                        g = f.style,
                        h = f.nodeName,
                        i = this.renderer,
                        j = this.symbolName,
                        k, l = this.shadows,
                        m, p = this.attrSetters,
                        u = this;
                    la(a) && t(b) && (c = a, a = {}, a[c] = b);
                    if(la(a)) c = a, u = c === "strokeWidth" || c === "stroke-width" ? this.strokeweight : this[c];
                    else for(c in a)
                    if(d = a[c], m = !1, e = p[c] && p[c].call(this, d, c), e !== !1 && d !== null) {
                        e !== x && (d = e);
                        if(j && /^(x|y|r|start|end|width|height|innerR|anchorX|anchorY)/.test(c)) k || (this.symbolAttr(a), k = !0), m = !0;
                        else if(c === "d") {
                            d = d || [];
                            this.d = d.join(" ");
                            e = d.length;
                            for(m = []; e--;)
                            m[e] = Aa(d[e]) ? s(d[e] * 10) - 5 : d[e] === "Z" ? "x" : d[e];
                            d = m.join(" ") || "x";
                            f.path = d;
                            if(l) for(e = l.length; e--;)
                            l[e].path = l[e].cutOff ? this.cutOffPath(d, l[e].cutOff) : d;
                            m = !0
                        } else if(c === "visibility") {
                            if(l) for(e = l.length; e--;)
                            l[e].style[c] = d;
                            h === "DIV" && (d = d === "hidden" ? "-999em" : 0, c = "top");
                            g[c] = d;
                            m = !0
                        } else if(c === "zIndex") d && (g[c] = d), m = !0;
                        else if(c === "width" || c === "height") d = y(0, d), this[c] = d, this.updateClipping ? (this[c] = d, this.updateClipping()) : g[c] = d, m = !0;
                        else if(c === "x" || c === "y") this[c] = d, g[{
                            x: "left",
                            y: "top"
                        }[c]] = d;
                        else if(c === "class") f.className = d;
                        else if(c === "stroke") d = i.color(d, f, c), c = "strokecolor";
                        else if(c === "stroke-width" || c === "strokeWidth") f.stroked = d ? !0 : !1, c = "strokeweight", this[c] = d, Aa(d) && (d += "px");
                        else if(c === "dashstyle")
                        (f.getElementsByTagName("stroke")[0] || Q(i.prepVML(["<stroke/>"]), null, null, f))[c] = d || "solid", this.dashstyle = d, m = !0;
                        else if(c === "fill") h === "SPAN" ? g.color = d : (f.filled = d !== R ? !0 : !1, d = i.color(d, f, c, this), c = "fillcolor");
                        else if(h === "shape" && c === "rotation") this[c] = d, f.style.left = -s(Y(d * ab) + 1) + "px", f.style.top = s(V(d * ab)) + "px";
                        else if(c === "translateX" || c === "translateY" || c === "rotation") this[c] = d, this.updateTransform(), m = !0;
                        else if(c === "text") this.bBox = null, f.innerHTML = d, m = !0;
                        m || (Qa ? f[c] = d : z(f, c, d))
                    }
                    return u
                },
                clip: function(a) {
                    var b = this,
                        c, d = b.element,
                        e = d.parentNode;
                    a ? (c = a.members, c.push(b), b.destroyClip = function() {
                        Ba(c, b)
                    }, e && e.className === "highcharts-tracker" && !Qa && H(d, {
                        visibility: "hidden"
                    }), a = a.getCSS(b)) : (b.destroyClip && b.destroyClip(), a = {
                        clip: Qa ? "inherit" : "rect(auto)"
                    });
                    return b.css(a)
                },
                css: va.prototype.htmlCss,
                safeRemoveChild: function(a) {
                    a.parentNode && Na(a)
                },
                destroy: function() {
                    this.destroyClip && this.destroyClip();
                    return va.prototype.destroy.apply(this)
                },
                empty: function() {
                    for(var a = this.element.childNodes, b = a.length, c; b--;)
                    c = a[b], c.parentNode.removeChild(c)
                },
                on: function(a, b) {
                    this.element["on" + a] = function() {
                        var a = K.event;
                        a.target = a.srcElement;
                        b(a)
                    };
                    return this
                },
                cutOffPath: function(a, b) {
                    var c, a = a.split(/[ ,]/);
                    c = a.length;
                    if(c === 9 || c === 11) a[c - 4] = a[c - 2] = w(a[c - 2]) - 10 * b;
                    return a.join(" ")
                },
                shadow: function(a, b, c) {
                    var d = [],
                        e, f = this.element,
                        g = this.renderer,
                        h, i = f.style,
                        j, k = f.path,
                        l, m, p, u;
                    k && typeof k.value !== "string" && (k = "x");
                    m = k;
                    if(a) {
                        p = o(a.width, 3);
                        u = (a.opacity || 0.15) / p;
                        for(e = 1; e <= 3; e++) {
                            l = p * 2 + 1 - 2 * e;
                            c && (m = this.cutOffPath(k.value, l + 0.5));
                            j = ['<shape isShadow="true" strokeweight="', l, '" filled="false" path="', m, '" coordsize="10 10" style="', f.style.cssText, '" />'];
                            h = Q(g.prepVML(j), null, {
                                left: w(i.left) + o(a.offsetX, 1),
                                top: w(i.top) + o(a.offsetY, 1)
                            });
                            if(c) h.cutOff = l + 1;
                            j = ['<stroke color="', a.color || "black", '" opacity="', u * e, '"/>'];
                            Q(g.prepVML(j), null, null, h);
                            b ? b.element.appendChild(h) : f.parentNode.insertBefore(h, f);
                            d.push(h)
                        }
                        this.shadows = d
                    }
                    return this
                }
            };
            ja = ca(va, ja);
            var ha = {
                Element: ja,
                isIE8: Fa.indexOf("MSIE 8.0") > -1,
                init: function(a, b, c) {
                    var d, e;
                    this.alignedObjects = [];
                    d = this.createElement(ia);
                    e = d.element;
                    e.style.position = "relative";
                    a.appendChild(d.element);
                    this.box = e;
                    this.boxWrapper = d;
                    this.setSize(b, c, !1);
                    if(!C.namespaces.hcv) C.namespaces.add("hcv", "urn:schemas-microsoft-com:vml"), C.createStyleSheet().cssText = "hcv\\:fill, hcv\\:path, hcv\\:shape, hcv\\:stroke{ behavior:url(#default#VML); display: inline-block; } "
                },
                isHidden: function() {
                    return !this.box.offsetWidth
                },
                clipRect: function(a, b, c, d) {
                    var e = this.createElement(),
                        f = X(a);
                    return r(e, {
                        members: [],
                        left: f ? a.x : a,
                        top: f ? a.y : b,
                        width: f ? a.width : c,
                        height: f ? a.height : d,
                        getCSS: function(a) {
                            var b = a.inverted,
                                c = this.top,
                                d = this.left,
                                e = d + this.width,
                                f = c + this.height,
                                c = {
                                    clip: "rect(" + s(b ? d : c) + "px," + s(b ? f : e) + "px," + s(b ? e : f) + "px," + s(b ? c : d) + "px)"
                                };
                            !b && Qa && a.element.nodeName !== "IMG" && r(c, {
                                width: e + "px",
                                height: f + "px"
                            });
                            return c
                        },
                        updateClipping: function() {
                            n(e.members, function(a) {
                                a.css(e.getCSS(a))
                            })
                        }
                    })
                },
                color: function(a, b, c, d) {
                    var e = this,
                        f, g = /^rgba/,
                        h, i, j = R;
                    a && a.linearGradient ? i = "gradient" : a && a.radialGradient && (i = "pattern");
                    if(i) {
                        var k, l, m = a.linearGradient || a.radialGradient,
                            p, u, o, q, D, t = "",
                            a = a.stops,
                            s, v = [],
                            F = function() {
                                h = ['<fill colors="' + v.join(",") + '" opacity="', o, '" o:opacity2="', u, '" type="', i, '" ', t, 'focus="100%" method="any" />'];
                                Q(e.prepVML(h), null, null, b)
                            };
                        p = a[0];
                        s = a[a.length - 1];
                        p[0] > 0 && a.unshift([0, p[1]]);
                        s[0] < 1 && a.push([1, s[1]]);
                        n(a, function(a, b) {
                            g.test(a[1]) ? (f = qa(a[1]), k = f.get("rgb"), l = f.get("a")) : (k = a[1], l = 1);
                            v.push(a[0] * 100 + "% " + k);
                            b ? (o = l, q = k) : (u = l, D = k)
                        });
                        if(c === "fill") if(i === "gradient") c = m.x1 || m[0] || 0, a = m.y1 || m[1] || 0, p = m.x2 || m[2] || 0, m = m.y2 || m[3] || 0, t = 'angle="' + (90 - J.atan((m - a) / (p - c)) * 180 / xa) + '"', F();
                        else {
                            var j = m.r,
                                r = j * 2,
                                P = j * 2,
                                y = m.cx,
                                x = m.cy,
                                A = b.radialReference,
                                w, j = function() {
                                    A && (w = d.getBBox(), y += (A[0] - w.x) / w.width - 0.5, x += (A[1] - w.y) / w.height - 0.5, r *= A[2] / w.width, P *= A[2] / w.height);
                                    t = 'src="' + M.global.VMLRadialGradientURL + '" size="' + r + "," + P + '" origin="0.5,0.5" position="' + y + "," + x + '" color2="' + D + '" ';
                                    F()
                                };
                            d.added ? j() : I(d, "add", j);
                            j = q
                        } else j = k
                    } else if(g.test(a) && b.tagName !== "IMG") f = qa(a), h = ["<", c, ' opacity="', f.get("a"), '"/>'], Q(this.prepVML(h), null, null, b), j = f.get("rgb");
                    else {
                        j = b.getElementsByTagName(c);
                        if(j.length) j[0].opacity = 1;
                        j = a
                    }
                    return j
                },
                prepVML: function(a) {
                    var b = this.isIE8,
                        a = a.join("");
                    b ? (a = a.replace("/>", ' xmlns="urn:schemas-microsoft-com:vml" />'), a = a.indexOf('style="') === -1 ? a.replace("/>", ' style="display:inline-block;behavior:url(#default#VML);" />') : a.replace('style="', 'style="display:inline-block;behavior:url(#default#VML);')) : a = a.replace("<", "<hcv:");
                    return a
                },
                text: ra.prototype.html,
                path: function(a) {
                    var b = {
                        coordsize: "10 10"
                    };
                    Ha(a) ? b.d = a : X(a) && r(b, a);
                    return this.createElement("shape").attr(b)
                },
                circle: function(a, b, c) {
                    return this.symbol("circle").attr({
                        x: a - c,
                        y: b - c,
                        width: 2 * c,
                        height: 2 * c
                    })
                },
                g: function(a) {
                    var b;
                    a && (b = {
                        cNameName: "highcharts-" + a,
                        "class": "highcharts-" + a
                    });
                    return this.createElement(ia).attr(b)
                },
                image: function(a, b, c, d, e) {
                    var f = this.createElement("img").attr({
                        src: a
                    });
                    arguments.length > 1 && f.attr({
                        x: b,
                        y: c,
                        width: d,
                        height: e
                    });
                    return f
                },
                rect: function(a, b, c, d, e, f) {
                    if(X(a)) b = a.y, c = a.width, d = a.height, f = a.strokeWidth, a = a.x;
                    var g = this.symbol("rect");
                    g.r = e;
                    return g.attr(g.crisp(f, a, b, y(c, 0), y(d, 0)))
                },
                invertChild: function(a, b) {
                    var c = b.style;
                    H(a, {
                        flip: "x",
                        left: w(c.width) - 1,
                        top: w(c.height) - 1,
                        rotation: -90
                    })
                },
                symbols: {
                    arc: function(a, b, c, d, e) {
                        var f = e.start,
                            g = e.end,
                            h = e.r || c || d,
                            c = V(f),
                            d = Y(f),
                            i = V(g),
                            j = Y(g),
                            k = e.innerR,
                            l = 0.08 / h,
                            m = k && 0.1 / k || 0;
                        if(g - f === 0) return ["x"];
                        else 2 * xa - g + f < l ? i = -l : g - f < m && (i = V(f + m));
                        f = ["wa", a - h, b - h, a + h, b + h, a + h * c, b + h * d, a + h * i, b + h * j];
                        e.open && !k && f.push("e", "M", a, b);
                        f.push("at", a - k, b - k, a + k, b + k, a + k * i, b + k * j, a + k * c, b + k * d, "x", "e");
                        return f
                    },
                    circle: function(a, b, c, d) {
                        return ["wa", a, b, a + c, b + d, a + c, b + d / 2, a + c, b + d / 2, "e"]
                    },
                    rect: function(a, b, c, d, e) {
                        var f = a + c,
                            g = b + d,
                            h;
                        !t(e) || !e.r ? f = ra.prototype.symbols.square.apply(0, arguments) : (h = O(e.r, c, d), f = ["M", a + h, b, "L", f - h, b, "wa", f - 2 * h, b, f, b + 2 * h, f - h, b, f, b + h, "L", f, g - h, "wa", f - 2 * h, g - 2 * h, f, g, f, g - h, f - h, g, "L", a + h, g, "wa", a, g - 2 * h, a + 2 * h, g, a + h, g, a, g - h, "L", a, b + h, "wa", a, b, a + 2 * h, b + 2 * h, a, b + h, a + h, b, "x", "e"]);
                        return f
                    }
                }
            };
            ja = function() {
                this.init.apply(this, arguments)
            };
            ja.prototype = A(ra.prototype, ha);
            Ra = ja
        }
        var gb, Mb;
        if(U) gb = function() {
            pa = "http://www.w3.org/1999/xhtml"
        }, gb.prototype.symbols = {}, Mb = function() {
            function a() {
                var a = b.length,
                    d;
                for(d = 0; d < a; d++)
                b[d]();
                b = []
            }
            var b = [];
            return {
                push: function(c, d) {
                    b.length === 0 && Qb(d, a);
                    b.push(c)
                }
            }
        }();
        Ra = ja || gb || ra;
        Pa.prototype = {
            addLabel: function() {
                var a = this.axis,
                    b = a.options,
                    c = a.chart,
                    d = a.horiz,
                    e = a.categories,
                    f = this.pos,
                    g = b.labels,
                    h = a.tickPositions,
                    d = e && d && e.length && !g.step && !g.staggerLines && !g.rotation && c.plotWidth / h.length || !d && c.plotWidth / 2,
                    i = f === h[0],
                    j = f === h[h.length - 1],
                    k = e && t(e[f]) ? e[f] : f,
                    e = this.label,
                    h = h.info,
                    l;
                a.isDatetimeAxis && h && (l = b.dateTimeLabelFormats[h.higherRanks[f] || h.unitName]);
                this.isFirst = i;
                this.isLast = j;
                b = a.labelFormatter.call({
                    axis: a,
                    chart: c,
                    isFirst: i,
                    isLast: j,
                    dateTimeLabelFormat: l,
                    value: a.isLog ? ea(ba(k)) : k
                });
                f = d && {
                    width: y(1, s(d - 2 * (g.padding || 10))) + "px"
                };
                f = r(f, g.style);
                if(t(e)) e && e.attr({
                    text: b
                }).css(f);
                else {
                    d = {
                        align: g.align
                    };
                    if(Aa(g.rotation)) d.rotation = g.rotation;
                    this.label = t(b) && g.enabled ? c.renderer.text(b, 0, 0, g.useHTML).attr(d).css(f).add(a.labelGroup) : null
                }
            },
            getLabelSize: function() {
                var a = this.label,
                    b = this.axis;
                return a ? (this.labelBBox = a.getBBox())[b.horiz ? "height" : "width"] : 0
            },
            getLabelSides: function() {
                var a = this.axis.options.labels,
                    b = this.labelBBox.width,
                    a = b * {
                        left: 0,
                        center: 0.5,
                        right: 1
                    }[a.align] - a.x;
                return [-a, b - a]
            },
            handleOverflow: function(a, b) {
                var c = !0,
                    d = this.axis,
                    e = d.chart,
                    f = this.isFirst,
                    g = this.isLast,
                    h = b.x,
                    i = d.reversed,
                    j = d.tickPositions;
                if(f || g) {
                    var k = this.getLabelSides(),
                        l = k[0],
                        k = k[1],
                        e = e.plotLeft,
                        m = e + d.len,
                        j = (d = d.ticks[j[a + (f ? 1 : -1)]]) && d.label.xy && d.label.xy.x + d.getLabelSides()[f ? 0 : 1];
                    f && !i || g && i ? h + l < e && (h = e - l, d && h + k > j && (c = !1)) : h + k > m && (h = m - k, d && h + l < j && (c = !1));
                    b.x = h
                }
                return c
            },
            getPosition: function(a, b, c, d) {
                var e = this.axis,
                    f = e.chart,
                    g = d && f.oldChartHeight || f.chartHeight;
                return {
                    x: a ? e.translate(b + c, null, null, d) + e.transB : e.left + e.offset + (e.opposite ? (d && f.oldChartWidth || f.chartWidth) - e.right - e.left : 0),
                    y: a ? g - e.bottom + e.offset - (e.opposite ? e.height : 0) : g - e.translate(b + c, null, null, d) - e.transB
                }
            },
            getLabelPosition: function(a, b, c, d, e, f, g, h) {
                var i = this.axis,
                    j = i.transA,
                    k = i.reversed,
                    i = i.staggerLines,
                    a = a + e.x - (f && d ? f * j * (k ? -1 : 1) : 0),
                    b = b + e.y - (f && !d ? f * j * (k ? 1 : -1) : 0);
                t(e.y) || (b += w(c.styles.lineHeight) * 0.9 - c.getBBox().height / 2);
                i && (b += g / (h || 1) % i * 16);
                return {
                    x: a,
                    y: b
                }
            },
            getMarkPath: function(a, b, c, d, e, f) {
                return f.crispLine(["M", a, b, "L", a + (e ? 0 : -c), b + (e ? c : 0)], d)
            },
            render: function(a, b) {
                var c = this.axis,
                    d = c.options,
                    e = c.chart.renderer,
                    f = c.horiz,
                    g = this.type,
                    h = this.label,
                    i = this.pos,
                    j = d.labels,
                    k = this.gridLine,
                    l = g ? g + "Grid" : "grid",
                    m = g ? g + "Tick" : "tick",
                    p = d[l + "LineWidth"],
                    u = d[l + "LineColor"],
                    n = d[l + "LineDashStyle"],
                    q = d[m + "Length"],
                    l = d[m + "Width"] || 0,
                    D = d[m + "Color"],
                    t = d[m + "Position"],
                    m = this.mark,
                    s = j.step,
                    v = !0,
                    F = c.tickmarkOffset,
                    r = this.getPosition(f, i, F, b),
                    P = r.x,
                    r = r.y,
                    y = c.staggerLines;
                if(p) {
                    i = c.getPlotLinePath(i + F, p, b);
                    if(k === x) {
                        k = {
                            stroke: u,
                            "stroke-width": p
                        };
                        if(n) k.dashstyle = n;
                        if(!g) k.zIndex = 1;
                        this.gridLine = k = p ? e.path(i).attr(k).add(c.gridGroup) : null
                    }
                    if(!b && k && i) k[this.isNew ? "attr" : "animate"]({
                        d: i
                    })
                }
                if(l && q) t === "inside" && (q = -q), c.opposite && (q = -q), g = this.getMarkPath(P, r, q, l, f, e), m ? m.animate({
                    d: g
                }) : this.mark = e.path(g).attr({
                    stroke: D,
                    "stroke-width": l
                }).add(c.axisGroup);
                if(h && !isNaN(P)) h.xy = r = this.getLabelPosition(P, r, h, f, j, F, a, s), this.isFirst && !o(d.showFirstLabel, 1) || this.isLast && !o(d.showLastLabel, 1) ? v = !1 : !y && f && j.overflow === "justify" && !this.handleOverflow(a, r) && (v = !1), s && a % s && (v = !1), v ? (h[this.isNew ? "attr" : "animate"](r), h.show(), this.isNew = !1) : h.hide()
            },
            destroy: function() {
                Ea(this, this.axis)
            }
        };
        nb.prototype = {
            render: function() {
                var a = this,
                    b = a.axis,
                    c = b.horiz,
                    d = (b.pointRange || 0) / 2,
                    e = a.options,
                    f = e.label,
                    g = a.label,
                    h = e.width,
                    i = e.to,
                    j = e.from,
                    k = t(j) && t(i),
                    l = e.value,
                    m = e.dashStyle,
                    p = a.svgElem,
                    u = [],
                    n, q = e.color,
                    D = e.zIndex,
                    s = e.events,
                    r = b.chart.renderer;
                b.isLog && (j = ma(j), i = ma(i), l = ma(l));
                if(h) {
                    if(u = b.getPlotLinePath(l, h), d = {
                        stroke: q,
                        "stroke-width": h
                    }, m) d.dashstyle = m
                } else if(k) {
                    if(j = y(j, b.min - d), i = O(i, b.max + d), u = b.getPlotBandPath(j, i, e), d = {
                        fill: q
                    }, e.borderWidth) d.stroke = e.borderColor, d["stroke-width"] = e.borderWidth
                } else return;
                if(t(D)) d.zIndex = D;
                if(p) u ? p.animate({
                    d: u
                }, null, p.onGetPath) : (p.hide(), p.onGetPath = function() {
                    p.show()
                });
                else if(u && u.length && (a.svgElem = p = r.path(u).attr(d).add(), s)) for(n in e = function(b) {
                    p.on(b, function(c) {
                        s[b].apply(a, [c])
                    })
                }, s)
                e(n);
                if(f && t(f.text) && u && u.length && b.width > 0 && b.height > 0) {
                    f = A({
                        align: c && k && "center",
                        x: c ? !k && 4 : 10,
                        verticalAlign: !c && k && "middle",
                        y: c ? k ? 16 : 10 : k ? 6 : -4,
                        rotation: c && !k && 90
                    }, f);
                    if(!g) a.label = g = r.text(f.text, 0, 0).attr({
                        align: f.textAlign || f.align,
                        rotation: f.rotation,
                        zIndex: D
                    }).css(f.style).add();
                    b = [u[1], u[4], o(u[6], u[1])];
                    u = [u[2], u[5], o(u[7], u[2])];
                    c = Ma(b);
                    k = Ma(u);
                    g.align(f, !1, {
                        x: c,
                        y: k,
                        width: Da(b) - c,
                        height: Da(u) - k
                    });
                    g.show()
                } else g && g.hide();
                return a
            },
            destroy: function() {
                Ba(this.axis.plotLinesAndBands, this);
                Ea(this, this.axis)
            }
        };
        Hb.prototype = {
            destroy: function() {
                Ea(this, this.axis)
            },
            setTotal: function(a) {
                this.cum = this.total = a
            },
            render: function(a) {
                var b = this.options.formatter.call(this);
                this.label ? this.label.attr({
                    text: b,
                    visibility: "hidden"
                }) : this.label = this.axis.chart.renderer.text(b, 0, 0).css(this.options.style).attr({
                    align: this.textAlign,
                    rotation: this.options.rotation,
                    visibility: "hidden"
                }).add(a)
            },
            setOffset: function(a, b) {
                var c = this.axis,
                    d = c.chart,
                    e = d.inverted,
                    f = this.isNegative,
                    g = c.translate(this.percent ? 100 : this.total, 0, 0, 0, 1),
                    c = c.translate(0),
                    c = L(g - c),
                    h = d.xAxis[0].translate(this.x) + a,
                    i = d.plotHeight,
                    f = {
                        x: e ? f ? g : g - c : h,
                        y: e ? i - h - b : f ? i - g - c : i - g,
                        width: e ? c : b,
                        height: e ? b : c
                    };
                if(e = this.label) e.align(this.alignOptions, null, f), f = e.alignAttr, e.attr({
                    visibility: this.options.crop === !1 || d.isInsidePlot(f.x, f.y) ? Z ? "inherit" : "visible" : "hidden"
                })
            }
        };
        ob.prototype = {
            defaultOptions: {
                dateTimeLabelFormats: {
                    millisecond: "%H:%M:%S.%L",
                    second: "%H:%M:%S",
                    minute: "%H:%M",
                    hour: "%H:%M",
                    day: "%e. %b",
                    week: "%e. %b",
                    month: "%b '%y",
                    year: "%Y"
                },
                endOnTick: !1,
                gridLineColor: "#C0C0C0",
                labels: G,
                lineColor: "#C0D0E0",
                lineWidth: 1,
                minPadding: 0.01,
                maxPadding: 0.01,
                minorGridLineColor: "#E0E0E0",
                minorGridLineWidth: 1,
                minorTickColor: "#A0A0A0",
                minorTickLength: 2,
                minorTickPosition: "outside",
                startOfWeek: 1,
                startOnTick: !1,
                tickColor: "#C0D0E0",
                tickLength: 5,
                tickmarkPlacement: "between",
                tickPixelInterval: 100,
                tickPosition: "outside",
                tickWidth: 1,
                title: {
                    align: "middle",
                    style: {
                        color: "#6D869F",
                        fontWeight: "bold"
                    }
                },
                type: "linear"
            },
            defaultYAxisOptions: {
                endOnTick: !0,
                gridLineWidth: 1,
                tickPixelInterval: 72,
                showLastLabel: !0,
                labels: {
                    align: "right",
                    x: -8,
                    y: 3
                },
                lineWidth: 0,
                maxPadding: 0.05,
                minPadding: 0.05,
                startOnTick: !0,
                tickWidth: 0,
                title: {
                    rotation: 270,
                    text: "Y-values"
                },
                stackLabels: {
                    enabled: !1,
                    formatter: function() {
                        return this.total
                    },
                    style: G.style
                }
            },
            defaultLeftAxisOptions: {
                labels: {
                    align: "right",
                    x: -8,
                    y: null
                },
                title: {
                    rotation: 270
                }
            },
            defaultRightAxisOptions: {
                labels: {
                    align: "left",
                    x: 8,
                    y: null
                },
                title: {
                    rotation: 90
                }
            },
            defaultBottomAxisOptions: {
                labels: {
                    align: "center",
                    x: 0,
                    y: 14
                },
                title: {
                    rotation: 0
                }
            },
            defaultTopAxisOptions: {
                labels: {
                    align: "center",
                    x: 0,
                    y: -5
                },
                title: {
                    rotation: 0
                }
            },
            init: function(a, b) {
                var c = b.isX;
                this.horiz = a.inverted ? !c : c;
                this.xOrY = (this.isXAxis = c) ? "x" : "y";
                this.opposite = b.opposite;
                this.side = this.horiz ? this.opposite ? 0 : 2 : this.opposite ? 1 : 3;
                this.setOptions(b);
                var d = this.options,
                    e = d.type,
                    f = e === "datetime";
                this.labelFormatter = d.labels.formatter || this.defaultLabelFormatter;
                this.staggerLines = this.horiz && d.labels.staggerLines;
                this.userOptions = b;
                this.minPixelPadding = 0;
                this.chart = a;
                this.reversed = d.reversed;
                this.categories = d.categories;
                this.isLog = e === "logarithmic";
                this.isLinked = t(d.linkedTo);
                this.isDatetimeAxis = f;
                this.tickmarkOffset = d.categories && d.tickmarkPlacement === "between" ? 0.5 : 0;
                this.ticks = {};
                this.minorTicks = {};
                this.plotLinesAndBands = [];
                this.alternateBands = {};
                this.len = 0;
                this.minRange = this.userMinRange = d.minRange || d.maxZoom;
                this.range = d.range;
                this.offset = d.offset || 0;
                this.stacks = {};
                this.min = this.max = null;
                var g, d = this.options.events;
                a.axes.push(this);
                a[c ? "xAxis" : "yAxis"].push(this);
                this.series = [];
                if(a.inverted && c && this.reversed === x) this.reversed = !0;
                this.removePlotLine = this.removePlotBand = this.removePlotBandOrLine;
                this.addPlotLine = this.addPlotBand = this.addPlotBandOrLine;
                for(g in d)
                I(this, g, d[g]);
                if(this.isLog) this.val2lin = ma, this.lin2val = ba
            },
            setOptions: function(a) {
                this.options = A(this.defaultOptions, this.isXAxis ? {} : this.defaultYAxisOptions, [this.defaultTopAxisOptions, this.defaultRightAxisOptions, this.defaultBottomAxisOptions, this.defaultLeftAxisOptions][this.side], A(M[this.isXAxis ? "xAxis" : "yAxis"], a))
            },
            defaultLabelFormatter: function() {
                var a = this.axis,
                    b = this.value,
                    c = this.dateTimeLabelFormat,
                    d = M.lang.numericSymbols,
                    e = d && d.length,
                    f, g = a.isLog ? b : a.tickInterval;
                if(a.categories) f = b;
                else if(c) f = cb(c, b);
                else if(e && g >= 1E3) for(; e-- && f === x;)
                a = Math.pow(1E3, e + 1), g >= a && d[e] !== null && (f = Ia(b / a, -1) + d[e]);
                f === x && (f = b >= 1E3 ? Ia(b, 0) : Ia(b, -1));
                return f
            },
            getSeriesExtremes: function() {
                var a = this,
                    b = a.chart,
                    c = a.stacks,
                    d = [],
                    e = [],
                    f;
                a.hasVisibleSeries = !1;
                a.dataMin = a.dataMax = null;
                n(a.series, function(g) {
                    if(g.visible || !b.options.chart.ignoreHiddenSeries) {
                        var h = g.options,
                            i, j, k, l, m, p, u, n, q, D = h.threshold,
                            s, r = [],
                            v = 0;
                        a.hasVisibleSeries = !0;
                        if(a.isLog && D <= 0) D = h.threshold = null;
                        if(a.isXAxis) {
                            if(h = g.xData, h.length) a.dataMin = O(o(a.dataMin, h[0]), Ma(h)), a.dataMax = y(o(a.dataMax, h[0]), Da(h))
                        } else {
                            var F, w, P, A = g.cropped,
                                z = g.xAxis.getExtremes(),
                                C = !! g.modifyValue;
                            i = h.stacking;
                            a.usePercentage = i === "percent";
                            if(i) m = h.stack, l = g.type + o(m, ""), p = "-" + l, g.stackKey = l, j = d[l] || [], d[l] = j, k = e[p] || [], e[p] = k;
                            if(a.usePercentage) a.dataMin = 0, a.dataMax = 99;
                            h = g.processedXData;
                            u = g.processedYData;
                            s = u.length;
                            for(f = 0; f < s; f++)
                            if(n = h[f], q = u[f], i && (w = (F = q < D) ? k : j, P = F ? p : l, q = w[n] = t(w[n]) ? ea(w[n] + q) : q, c[P] || (c[P] = {}), c[P][n] || (c[P][n] = new Hb(a, a.options.stackLabels, F, n, m, i)), c[P][n].setTotal(q)), q !== null && q !== x && (C && (q = g.modifyValue(q)), A || (h[f + 1] || n) >= z.min && (h[f - 1] || n) <= z.max)) if(n = q.length) for(; n--;)
                            q[n] !== null && (r[v++] = q[n]);
                            else r[v++] = q;
                            if(!a.usePercentage && r.length) a.dataMin = O(o(a.dataMin, r[0]), Ma(r)), a.dataMax = y(o(a.dataMax, r[0]), Da(r));
                            if(t(D)) if(a.dataMin >= D) a.dataMin = D, a.ignoreMinPadding = !0;
                            else if(a.dataMax < D) a.dataMax = D, a.ignoreMaxPadding = !0
                        }
                    }
                })
            },
            translate: function(a, b, c, d, e, f) {
                var g = this.len,
                    h = 1,
                    i = 0,
                    j = d ? this.oldTransA : this.transA,
                    d = d ? this.oldMin : this.min,
                    e = this.options.ordinal || this.isLog && e;
                if(!j) j = this.transA;
                c && (h *= -1, i = g);
                this.reversed && (h *= -1, i -= h * g);
                b ? (this.reversed && (a = g - a), a = a / j + d, e && (a = this.lin2val(a))) : (e && (a = this.val2lin(a)), a = h * (a - d) * j + i + h * this.minPixelPadding + (f ? j * this.pointRange / 2 : 0));
                return a
            },
            getPlotLinePath: function(a, b, c) {
                var d = this.chart,
                    e = this.left,
                    f = this.top,
                    g, h, i, a = this.translate(a, null, null, c),
                    j = c && d.oldChartHeight || d.chartHeight,
                    k = c && d.oldChartWidth || d.chartWidth,
                    l;
                g = this.transB;
                c = h = s(a + g);
                g = i = s(j - a - g);
                if(isNaN(a)) l = !0;
                else if(this.horiz) {
                    if(g = f, i = j - this.bottom, c < e || c > e + this.width) l = !0
                } else if(c = e, h = k - this.right, g < f || g > f + this.height) l = !0;
                return l ? null : d.renderer.crispLine(["M", c, g, "L", h, i], b || 0)
            },
            getPlotBandPath: function(a, b) {
                var c = this.getPlotLinePath(b),
                    d = this.getPlotLinePath(a);
                d && c ? d.push(c[4], c[5], c[1], c[2]) : d = null;
                return d
            },
            getLinearTickPositions: function(a, b, c) {
                for(var d, b = ea(T(b / a) * a), c = ea(wa(c / a) * a), e = []; b <= c;) {
                    e.push(b);
                    b = ea(b + a);
                    if(b === d) break;
                    d = b
                }
                return e
            },
            getLogTickPositions: function(a, b, c, d) {
                var e = this.options,
                    f = this.len,
                    g = [];
                if(!d) this._minorAutoInterval = null;
                if(a >= 0.5) a = s(a), g = this.getLinearTickPositions(a, b, c);
                else if(a >= 0.08) for(var f = T(b), h, i, j, k, l, e = a > 0.3 ? [1, 2, 4] : a > 0.15 ? [1, 2, 4, 6, 8] : [1, 2, 3, 4, 5, 6, 7, 8, 9]; f < c + 1 && !l; f++) {
                    i = e.length;
                    for(h = 0; h < i && !l; h++)
                    j = ma(ba(f) * e[h]), j > b && g.push(k), k > c && (l = !0), k = j
                } else if(b = ba(b), c = ba(c), a = e[d ? "minorTickInterval" : "tickInterval"], a = o(a === "auto" ? null : a, this._minorAutoInterval, (c - b) * (e.tickPixelInterval / (d ? 5 : 1)) / ((d ? f / this.tickPositions.length : f) || 1)), a = hb(a, null, J.pow(10, T(J.log(a) / J.LN10))), g = Sa(this.getLinearTickPositions(a, b, c), ma), !d) this._minorAutoInterval = a / 5;
                if(!d) this.tickInterval = a;
                return g
            },
            getMinorTickPositions: function() {
                var a = this.tickPositions,
                    b = this.minorTickInterval,
                    c = [],
                    d, e;
                if(this.isLog) {
                    e = a.length;
                    for(d = 1; d < e; d++)
                    c = c.concat(this.getLogTickPositions(b, a[d - 1], a[d], !0))
                } else for(a = this.min + (a[0] - this.min) % b; a <= this.max; a += b)
                c.push(a);
                return c
            },
            adjustForMinRange: function() {
                var a = this.options,
                    b = this.min,
                    c = this.max,
                    d, e = this.dataMax - this.dataMin >= this.minRange,
                    f, g, h, i, j;
                if(this.isXAxis && this.minRange === x && !this.isLog) t(a.min) || t(a.max) ? this.minRange = null : (n(this.series, function(a) {
                    i = a.xData;
                    for(g = j = a.xIncrement ? 1 : i.length - 1; g > 0; g--)
                    if(h = i[g] - i[g - 1], f === x || h < f) f = h
                }), this.minRange = O(f * 5, this.dataMax - this.dataMin));
                if(c - b < this.minRange) {
                    var k = this.minRange;
                    d = (k - c + b) / 2;
                    d = [b - d, o(a.min, b - d)];
                    if(e) d[2] = this.dataMin;
                    b = Da(d);
                    c = [b + k, o(a.max, b + k)];
                    if(e) c[2] = this.dataMax;
                    c = Ma(c);
                    c - b < k && (d[0] = c - k, d[1] = o(a.min, c - k), b = Da(d))
                }
                this.min = b;
                this.max = c
            },
            setAxisTranslation: function() {
                var a = this.max - this.min,
                    b = 0,
                    c, d = 0,
                    e = 0,
                    f = this.linkedParent,
                    g = this.transA;
                if(this.isXAxis) f ? (d = f.minPointOffset, e = f.pointRangePadding) : n(this.series, function(a) {
                    var f = a.pointRange,
                        g = a.options.pointPlacement,
                        k = a.closestPointRange;
                    b = y(b, f);
                    d = y(d, g ? 0 : f / 2);
                    e = y(e, g === "on" ? 0 : f);
                    !a.noSharedTooltip && t(k) && (c = t(c) ? O(c, k) : k)
                }), this.minPointOffset = d, this.pointRangePadding = e, this.pointRange = b, this.closestPointRange = c;
                this.oldTransA = g;
                this.translationSlope = this.transA = g = this.len / (a + e || 1);
                this.transB = this.horiz ? this.left : this.bottom;
                this.minPixelPadding = g * d
            },
            setTickPositions: function(a) {
                var b = this,
                    c = b.chart,
                    d = b.options,
                    e = b.isLog,
                    f = b.isDatetimeAxis,
                    g = b.isXAxis,
                    h = b.isLinked,
                    i = b.options.tickPositioner,
                    j = d.maxPadding,
                    k = d.minPadding,
                    l = d.tickInterval,
                    m = d.minTickInterval,
                    p = d.tickPixelInterval,
                    u = b.categories;
                h ? (b.linkedParent = c[g ? "xAxis" : "yAxis"][d.linkedTo], c = b.linkedParent.getExtremes(), b.min = o(c.min, c.dataMin), b.max = o(c.max, c.dataMax), d.type !== b.linkedParent.options.type && $a(11, 1)) : (b.min = o(b.userMin, d.min, b.dataMin), b.max = o(b.userMax, d.max, b.dataMax));
                if(e)!a && O(b.min, o(b.dataMin, b.min)) <= 0 && $a(10, 1), b.min = ea(ma(b.min)), b.max = ea(ma(b.max));
                if(b.range && (b.userMin = b.min = y(b.min, b.max - b.range), b.userMax = b.max, a)) b.range = null;
                b.adjustForMinRange();
                if(!u && !b.usePercentage && !h && t(b.min) && t(b.max)) {
                    c = b.max - b.min || 1;
                    if(!t(d.min) && !t(b.userMin) && k && (b.dataMin < 0 || !b.ignoreMinPadding)) b.min -= c * k;
                    if(!t(d.max) && !t(b.userMax) && j && (b.dataMax > 0 || !b.ignoreMaxPadding)) b.max += c * j
                }
                b.tickInterval = b.min === b.max || b.min === void 0 || b.max === void 0 ? 1 : h && !l && p === b.linkedParent.options.tickPixelInterval ? b.linkedParent.tickInterval : o(l, u ? 1 : (b.max - b.min) * p / (b.len || 1));
                g && !a && n(b.series, function(a) {
                    a.processData(b.min !== b.oldMin || b.max !== b.oldMax)
                });
                b.setAxisTranslation(a);
                b.beforeSetTickPositions && b.beforeSetTickPositions();
                if(b.postProcessTickInterval) b.tickInterval = b.postProcessTickInterval(b.tickInterval);
                if(!l && b.tickInterval < m) b.tickInterval = m;
                if(!f && !e && (a = J.pow(10, T(J.log(b.tickInterval) / J.LN10)), !l)) b.tickInterval = hb(b.tickInterval, null, a, d);
                b.minorTickInterval = d.minorTickInterval === "auto" && b.tickInterval ? b.tickInterval / 5 : d.minorTickInterval;
                b.tickPositions = i = d.tickPositions || i && i.apply(b, [b.min, b.max]);
                if(!i) i = f ? (b.getNonLinearTimeTicks || Ob)(Nb(b.tickInterval, d.units), b.min, b.max, d.startOfWeek, b.ordinalPositions, b.closestPointRange, !0) : e ? b.getLogTickPositions(b.tickInterval, b.min, b.max) : b.getLinearTickPositions(b.tickInterval, b.min, b.max), b.tickPositions = i;
                if(!h) e = i[0], f = i[i.length - 1], h = b.minPointOffset || 0, d.startOnTick ? b.min = e : b.min - h > e && i.shift(), d.endOnTick ? b.max = f : b.max + h < f && i.pop()
            },
            setMaxTicks: function() {
                var a = this.chart,
                    b = a.maxTicks,
                    c = this.tickPositions,
                    d = this.xOrY;
                b || (b = {
                    x: 0,
                    y: 0
                });
                if(!this.isLinked && !this.isDatetimeAxis && c.length > b[d] && this.options.alignTicks !== !1) b[d] = c.length;
                a.maxTicks = b
            },
            adjustTickAmount: function() {
                var a = this.xOrY,
                    b = this.tickPositions,
                    c = this.chart.maxTicks;
                if(c && c[a] && !this.isDatetimeAxis && !this.categories && !this.isLinked && this.options.alignTicks !== !1) {
                    var d = this.tickAmount,
                        e = b.length;
                    this.tickAmount = a = c[a];
                    if(e < a) {
                        for(; b.length < a;)
                        b.push(ea(b[b.length - 1] + this.tickInterval));
                        this.transA *= (e - 1) / (a - 1);
                        this.max = b[b.length - 1]
                    }
                    if(t(d) && a !== d) this.isDirty = !0
                }
            },
            setScale: function() {
                var a = this.stacks,
                    b, c, d, e;
                this.oldMin = this.min;
                this.oldMax = this.max;
                this.oldAxisLength = this.len;
                this.setAxisSize();
                e = this.len !== this.oldAxisLength;
                n(this.series, function(a) {
                    if(a.isDirtyData || a.isDirty || a.xAxis.isDirty) d = !0
                });
                if(e || d || this.isLinked || this.userMin !== this.oldUserMin || this.userMax !== this.oldUserMax) if(this.getSeriesExtremes(), this.setTickPositions(), this.oldUserMin = this.userMin, this.oldUserMax = this.userMax, !this.isDirty) this.isDirty = e || this.min !== this.oldMin || this.max !== this.oldMax;
                if(!this.isXAxis) for(b in a)
                for(c in a[b])
                a[b][c].cum = a[b][c].total;
                this.setMaxTicks()
            },
            setExtremes: function(a, b, c, d, e) {
                var f = this,
                    g = f.chart,
                    c = o(c, !0),
                    e = r(e, {
                        min: a,
                        max: b
                    });
                E(f, "setExtremes", e, function() {
                    f.userMin = a;
                    f.userMax = b;
                    f.isDirtyExtremes = !0;
                    c && g.redraw(d)
                })
            },
            zoom: function(a, b) {
                this.setExtremes(a, b, !1, x, {
                    trigger: "zoom"
                });
                return !0
            },
            setAxisSize: function() {
                var a = this.chart,
                    b = this.options,
                    c = b.offsetLeft || 0,
                    d = b.offsetRight || 0;
                this.left = o(b.left, a.plotLeft + c);
                this.top = o(b.top, a.plotTop);
                this.width = o(b.width, a.plotWidth - c + d);
                this.height = o(b.height, a.plotHeight);
                this.bottom = a.chartHeight - this.height - this.top;
                this.right = a.chartWidth - this.width - this.left;
                this.len = y(this.horiz ? this.width : this.height, 0)
            },
            getExtremes: function() {
                var a = this.isLog;
                return {
                    min: a ? ea(ba(this.min)) : this.min,
                    max: a ? ea(ba(this.max)) : this.max,
                    dataMin: this.dataMin,
                    dataMax: this.dataMax,
                    userMin: this.userMin,
                    userMax: this.userMax
                }
            },
            getThreshold: function(a) {
                var b = this.isLog,
                    c = b ? ba(this.min) : this.min,
                    b = b ? ba(this.max) : this.max;
                c > a || a === null ? a = c : b < a && (a = b);
                return this.translate(a, 0, 1, 0, 1)
            },
            addPlotBandOrLine: function(a) {
                a = (new nb(this, a)).render();
                this.plotLinesAndBands.push(a);
                return a
            },
            getOffset: function() {
                var a = this,
                    b = a.chart,
                    c = b.renderer,
                    d = a.options,
                    e = a.tickPositions,
                    f = a.ticks,
                    g = a.horiz,
                    h = a.side,
                    i, j = 0,
                    k, l = 0,
                    m = d.title,
                    p = d.labels,
                    u = 0,
                    da = b.axisOffset,
                    q = [-1, 1, 1, -1][h],
                    D;
                a.hasData = b = a.hasVisibleSeries || t(a.min) && t(a.max) && !! e;
                a.showAxis = i = b || o(d.showEmpty, !0);
                if(!a.axisGroup) a.gridGroup = c.g("grid").attr({
                    zIndex: d.gridZIndex || 1
                }).add(), a.axisGroup = c.g("axis").attr({
                    zIndex: d.zIndex || 2
                }).add(), a.labelGroup = c.g("axis-labels").attr({
                    zIndex: p.zIndex || 7
                }).add();
                if(b || a.isLinked) n(e, function(b) {
                    f[b] ? f[b].addLabel() : f[b] = new Pa(a, b)
                }), n(e, function(a) {
                    if(h === 0 || h === 2 || {
                        1: "left",
                        3: "right"
                    }[h] === p.align) u = y(f[a].getLabelSize(), u)
                }), a.staggerLines && (u += (a.staggerLines - 1) * 16);
                else for(D in f)
                f[D].destroy(), delete f[D];
                if(m && m.text) {
                    if(!a.axisTitle) a.axisTitle = c.text(m.text, 0, 0, m.useHTML).attr({
                        zIndex: 7,
                        rotation: m.rotation || 0,
                        align: m.textAlign || {
                            low: "left",
                            middle: "center",
                            high: "right"
                        }[m.align]
                    }).css(m.style).add(a.axisGroup), a.axisTitle.isNew = !0;
                    if(i) j = a.axisTitle.getBBox()[g ? "height" : "width"], l = o(m.margin, g ? 5 : 10), k = m.offset;
                    a.axisTitle[i ? "show" : "hide"]()
                }
                a.offset = q * o(d.offset, da[h]);
                a.axisTitleMargin = o(k, u + l + (h !== 2 && u && q * d.labels[g ? "y" : "x"]));
                da[h] = y(da[h], a.axisTitleMargin + j + q * a.offset)
            },
            getLinePath: function(a) {
                var b = this.chart,
                    c = this.opposite,
                    d = this.offset,
                    e = this.horiz,
                    f = this.left + (c ? this.width : 0) + d;
                this.lineTop = c = b.chartHeight - this.bottom - (c ? this.height : 0) + d;
                return b.renderer.crispLine(["M", e ? this.left : f, e ? c : this.top, "L", e ? b.chartWidth - this.right : f, e ? c : b.chartHeight - this.bottom], a)
            },
            getTitlePosition: function() {
                var a = this.horiz,
                    b = this.left,
                    c = this.top,
                    d = this.len,
                    e = this.options.title,
                    f = a ? b : c,
                    g = this.opposite,
                    h = this.offset,
                    i = w(e.style.fontSize || 12),
                    d = {
                        low: f + (a ? 0 : d),
                        middle: f + d / 2,
                        high: f + (a ? d : 0)
                    }[e.align],
                    b = (a ? c + this.height : b) + (a ? 1 : -1) * (g ? -1 : 1) * this.axisTitleMargin + (this.side === 2 ? i : 0);
                return {
                    x: a ? d : b + (g ? this.width : 0) + h + (e.x || 0),
                    y: a ? b - (g ? this.height : 0) + h : d + (e.y || 0)
                }
            },
            render: function() {
                var a = this,
                    b = a.chart,
                    c = b.renderer,
                    d = a.options,
                    e = a.isLog,
                    f = a.isLinked,
                    g = a.tickPositions,
                    h = a.axisTitle,
                    i = a.stacks,
                    j = a.ticks,
                    k = a.minorTicks,
                    l = a.alternateBands,
                    m = d.stackLabels,
                    p = d.alternateGridColor,
                    u = a.tickmarkOffset,
                    o = d.lineWidth,
                    q, D = b.hasRendered && t(a.oldMin) && !isNaN(a.oldMin),
                    r = a.showAxis,
                    s, v;
                if(a.hasData || f) if(a.minorTickInterval && !a.categories && n(a.getMinorTickPositions(), function(b) {
                    k[b] || (k[b] = new Pa(a, b, "minor"));
                    D && k[b].isNew && k[b].render(null, !0);
                    k[b].isActive = !0;
                    k[b].render()
                }), n(g.slice(1).concat([g[0]]), function(b, c) {
                    c = c === g.length - 1 ? 0 : c + 1;
                    if(!f || b >= a.min && b <= a.max) j[b] || (j[b] = new Pa(a, b)), D && j[b].isNew && j[b].render(c, !0), j[b].isActive = !0, j[b].render(c)
                }), p && n(g, function(b, c) {
                    if(c % 2 === 0 && b < a.max) l[b] || (l[b] = new nb(a)), s = b + u, v = g[c + 1] !== x ? g[c + 1] + u : a.max, l[b].options = {
                        from: e ? ba(s) : s,
                        to: e ? ba(v) : v,
                        color: p
                    }, l[b].render(), l[b].isActive = !0
                }), !a._addedPlotLB) n((d.plotLines || []).concat(d.plotBands || []), function(b) {
                    a.addPlotBandOrLine(b)
                }), a._addedPlotLB = !0;
                n([j, k, l], function(a) {
                    for(var b in a)
                    a[b].isActive ? a[b].isActive = !1 : (a[b].destroy(), delete a[b])
                });
                if(o) q = a.getLinePath(o), a.axisLine ? a.axisLine.animate({
                    d: q
                }) : a.axisLine = c.path(q).attr({
                    stroke: d.lineColor,
                    "stroke-width": o,
                    zIndex: 7
                }).add(a.axisGroup), a.axisLine[r ? "show" : "hide"]();
                if(h && r) h[h.isNew ? "attr" : "animate"](a.getTitlePosition()), h.isNew = !1;
                if(m && m.enabled) {
                    var F, w, d = a.stackTotalGroup;
                    if(!d) a.stackTotalGroup = d = c.g("stack-labels").attr({
                        visibility: "visible",
                        zIndex: 6
                    }).add();
                    d.translate(b.plotLeft, b.plotTop);
                    for(F in i)
                    for(w in b = i[F], b)
                    b[w].render(d)
                }
                a.isDirty = !1
            },
            removePlotBandOrLine: function(a) {
                for(var b = this.plotLinesAndBands, c = b.length; c--;)
                b[c].id === a && b[c].destroy()
            },
            setTitle: function(a, b) {
                var c = this.chart,
                    d = this.options,
                    e = this.axisTitle;
                d.title = A(d.title, a);
                this.axisTitle = e && e.destroy();
                this.isDirty = !0;
                o(b, !0) && c.redraw()
            },
            redraw: function() {
                var a = this.chart;
                a.tracker.resetTracker && a.tracker.resetTracker(!0);
                this.render();
                n(this.plotLinesAndBands, function(a) {
                    a.render()
                });
                n(this.series, function(a) {
                    a.isDirty = !0
                })
            },
            setCategories: function(a, b) {
                var c = this.chart;
                this.categories = this.userOptions.categories = a;
                n(this.series, function(a) {
                    a.translate();
                    a.setTooltipPoints(!0)
                });
                this.isDirty = !0;
                o(b, !0) && c.redraw()
            },
            destroy: function() {
                var a = this,
                    b = a.stacks,
                    c;
                S(a);
                for(c in b)
                Ea(b[c]), b[c] = null;
                n([a.ticks, a.minorTicks, a.alternateBands, a.plotLinesAndBands], function(a) {
                    Ea(a)
                });
                n("stackTotalGroup,axisLine,axisGroup,gridGroup,labelGroup,axisTitle".split(","), function(b) {
                    a[b] && (a[b] = a[b].destroy())
                })
            }
        };
        pb.prototype = {
            destroy: function() {
                n(this.crosshairs, function(a) {
                    a && a.destroy()
                });
                if(this.label) this.label = this.label.destroy()
            },
            move: function(a, b, c, d) {
                var e = this,
                    f = e.now,
                    g = e.options.animation !== !1 && !e.isHidden;
                r(f, {
                    x: g ? (2 * f.x + a) / 3 : a,
                    y: g ? (f.y + b) / 2 : b,
                    anchorX: g ? (2 * f.anchorX + c) / 3 : c,
                    anchorY: g ? (f.anchorY + d) / 2 : d
                });
                e.label.attr(f);
                if(g && (L(a - f.x) > 1 || L(b - f.y) > 1)) clearTimeout(this.tooltipTimeout), this.tooltipTimeout = setTimeout(function() {
                    e && e.move(a, b, c, d)
                }, 32)
            },
            hide: function() {
                if(!this.isHidden) {
                    var a = this.chart.hoverPoints;
                    this.label.hide();
                    a && n(a, function(a) {
                        a.setState()
                    });
                    this.chart.hoverPoints = null;
                    this.isHidden = !0
                }
            },
            hideCrosshairs: function() {
                n(this.crosshairs, function(a) {
                    a && a.hide()
                })
            },
            getAnchor: function(a, b) {
                var c, d = this.chart,
                    e = d.inverted,
                    f = 0,
                    g = 0,
                    h, a = na(a);
                c = a[0].tooltipPos;
                c || (n(a, function(a) {
                    h = a.series.yAxis;
                    f += a.plotX;
                    g += (a.plotLow ? (a.plotLow + a.plotHigh) / 2 : a.plotY) + (!e && h ? h.top - d.plotTop : 0)
                }), f /= a.length, g /= a.length, c = [e ? d.plotWidth - g : f, this.shared && !e && a.length > 1 && b ? b.chartY - d.plotTop : e ? d.plotHeight - f : g]);
                return Sa(c, s)
            },
            getPosition: function(a, b, c) {
                var d = this.chart,
                    e = d.plotLeft,
                    f = d.plotTop,
                    g = d.plotWidth,
                    h = d.plotHeight,
                    i = o(this.options.distance, 12),
                    j = c.plotX,
                    c = c.plotY,
                    d = j + e + (d.inverted ? i : -a - i),
                    k = c - b + f + 15,
                    l;
                d < 7 && (d = e + y(j, 0) + i);
                d + a > e + g && (d -= d + a - (e + g), k = c - b + f - i, l = !0);
                k < f + 5 && (k = f + 5, l && c >= k && c <= k + b && (k = c + f + i));
                k + b > f + h && (k = y(f, f + h - b - i));
                return {
                    x: d,
                    y: k
                }
            },
            refresh: function(a, b) {
                function c() {
                    var a = this.points || na(this),
                        b = a[0].series,
                        c;
                    c = [b.tooltipHeaderFormatter(a[0].key)];
                    n(a, function(a) {
                        b = a.series;
                        c.push(b.tooltipFormatter && b.tooltipFormatter(a) || a.point.tooltipFormatter(b.tooltipOptions.pointFormat))
                    });
                    c.push(f.footerFormat || "");
                    return c.join("")
                }
                var d = this.chart,
                    e = this.label,
                    f = this.options,
                    g, h, i, j = {},
                    k, l = [];
                k = f.formatter || c;
                var j = d.hoverPoints,
                    m, p = f.crosshairs;
                i = this.shared;
                h = this.getAnchor(a, b);
                g = h[0];
                h = h[1];
                i && (!a.series || !a.series.noSharedTooltip) ? (d.hoverPoints = a, j && n(j, function(a) {
                    a.setState()
                }), n(a, function(a) {
                    a.setState("hover");
                    l.push(a.getLabelConfig())
                }), j = {
                    x: a[0].category,
                    y: a[0].y
                }, j.points = l, a = a[0]) : j = a.getLabelConfig();
                k = k.call(j);
                j = a.series;
                i = i || !j.isCartesian || j.tooltipOutsidePlot || d.isInsidePlot(g, h);
                k === !1 || !i ? this.hide() : (this.isHidden && e.show(), e.attr({
                    text: k
                }), m = f.borderColor || a.color || j.color || "#606060", e.attr({
                    stroke: m
                }), e = (f.positioner || this.getPosition).call(this, e.width, e.height, {
                    plotX: g,
                    plotY: h
                }), this.move(s(e.x), s(e.y), g + d.plotLeft, h + d.plotTop), this.isHidden = !1);
                if(p) {
                    p = na(p);
                    for(e = p.length; e--;)
                    if(i = a.series[e ? "yAxis" : "xAxis"], p[e] && i) if(i = i.getPlotLinePath(e ? o(a.stackY, a.y) : a.x, 1), this.crosshairs[e]) this.crosshairs[e].attr({
                        d: i,
                        visibility: "visible"
                    });
                    else {
                        j = {
                            "stroke-width": p[e].width || 1,
                            stroke: p[e].color || "#C0C0C0",
                            zIndex: p[e].zIndex || 2
                        };
                        if(p[e].dashStyle) j.dashstyle = p[e].dashStyle;
                        this.crosshairs[e] = d.renderer.path(i).attr(j).add()
                    }
                }
                E(d, "tooltipRefresh", {
                    text: k,
                    x: g + d.plotLeft,
                    y: h + d.plotTop,
                    borderColor: m
                })
            }
        };
        qb.prototype = {
            normalizeMouseEvent: function(a) {
                var b, c, d, a = a || K.event;
                if(!a.target) a.target = a.srcElement;
                a = Lb(a);
                d = a.touches ? a.touches.item(0) : a;
                this.chartPosition = b = Sb(this.chart.container);
                d.pageX === x ? (c = a.x, b = a.y) : (c = d.pageX - b.left, b = d.pageY - b.top);
                return r(a, {
                    chartX: s(c),
                    chartY: s(b)
                })
            },
            getMouseCoordinates: function(a) {
                var b = {
                    xAxis: [],
                    yAxis: []
                },
                    c = this.chart;
                n(c.axes, function(d) {
                    var e = d.isXAxis;
                    b[e ? "xAxis" : "yAxis"].push({
                        axis: d,
                        value: d.translate(((c.inverted ? !e : e) ? a.chartX - c.plotLeft : d.top + d.len - a.chartY) - d.minPixelPadding, !0)
                    })
                });
                return b
            },
            getIndex: function(a) {
                var b = this.chart;
                return b.inverted ? b.plotHeight + b.plotTop - a.chartY : a.chartX - b.plotLeft
            },
            onmousemove: function(a) {
                var b = this.chart,
                    c = b.series,
                    d = b.tooltip,
                    e, f = b.hoverPoint,
                    g = b.hoverSeries,
                    h, i, j = b.chartWidth,
                    k = this.getIndex(a);
                if(d && this.options.tooltip.shared && (!g || !g.noSharedTooltip)) {
                    e = [];
                    h = c.length;
                    for(i = 0; i < h; i++)
                    if(c[i].visible && c[i].options.enableMouseTracking !== !1 && !c[i].noSharedTooltip && c[i].tooltipPoints.length) b = c[i].tooltipPoints[k], b._dist = L(k - b[c[i].xAxis.tooltipPosName || "plotX"]), j = O(j, b._dist), e.push(b);
                    for(h = e.length; h--;)
                    e[h]._dist > j && e.splice(h, 1);
                    if(e.length && e[0].plotX !== this.hoverX) d.refresh(e, a), this.hoverX = e[0].plotX
                }
                if(g && g.tracker && (b = g.tooltipPoints[k]) && b !== f) b.onMouseOver()
            },
            resetTracker: function(a) {
                var b = this.chart,
                    c = b.hoverSeries,
                    d = b.hoverPoint,
                    e = b.tooltip,
                    b = e && e.shared ? b.hoverPoints : d;
                (a = a && e && b) && na(b)[0].plotX === x && (a = !1);
                if(a) e.refresh(b);
                else {
                    if(d) d.onMouseOut();
                    if(c) c.onMouseOut();
                    e && (e.hide(), e.hideCrosshairs());
                    this.hoverX = null
                }
            },
            setDOMEvents: function() {
                function a() {
                    if(b.selectionMarker) {
                        var f = {
                            xAxis: [],
                            yAxis: []
                        },
                            g = b.selectionMarker.getBBox(),
                            h = g.x - c.plotLeft,
                            l = g.y - c.plotTop,
                            m;
                        e && (n(c.axes, function(a) {
                            if(a.options.zoomEnabled !== !1) {
                                var b = a.isXAxis,
                                    d = c.inverted ? !b : b,
                                    e = a.translate(d ? h : c.plotHeight - l - g.height, !0, 0, 0, 1),
                                    d = a.translate((d ? h + g.width : c.plotHeight - l) - 2 * a.minPixelPadding, !0, 0, 0, 1);
                                !isNaN(e) && !isNaN(d) && (f[b ? "xAxis" : "yAxis"].push({
                                    axis: a,
                                    min: O(e, d),
                                    max: y(e, d)
                                }), m = !0)
                            }
                        }), m && E(c, "selection", f, function(a) {
                            c.zoom(a)
                        }));
                        b.selectionMarker = b.selectionMarker.destroy()
                    }
                    if(c) H(d, {
                        cursor: "auto"
                    }), c.cancelClick = e, c.mouseIsDown = e = !1;
                    S(C, fa ? "touchend" : "mouseup", a)
                }
                var b = this,
                    c = b.chart,
                    d = c.container,
                    e, f = b.zoomX && !c.inverted || b.zoomY && c.inverted,
                    g = b.zoomY && !c.inverted || b.zoomX && c.inverted;
                b.hideTooltipOnMouseMove = function(a) {
                    a = Lb(a);
                    b.chartPosition && c.hoverSeries && c.hoverSeries.isCartesian && !c.isInsidePlot(a.pageX - b.chartPosition.left - c.plotLeft, a.pageY - b.chartPosition.top - c.plotTop) && b.resetTracker()
                };
                b.hideTooltipOnMouseLeave = function() {
                    b.resetTracker();
                    b.chartPosition = null
                };
                d.onmousedown = function(d) {
                    d = b.normalizeMouseEvent(d);
                    !fa && d.preventDefault && d.preventDefault();
                    c.mouseIsDown = !0;
                    c.cancelClick = !1;
                    c.mouseDownX = b.mouseDownX = d.chartX;
                    b.mouseDownY = d.chartY;
                    I(C, fa ? "touchend" : "mouseup", a)
                };
                var h = function(a) {
                        if(!a || !(a.touches && a.touches.length > 1)) {
                            a = b.normalizeMouseEvent(a);
                            if(!fa) a.returnValue = !1;
                            var d = a.chartX,
                                h = a.chartY,
                                l = !c.isInsidePlot(d - c.plotLeft, h - c.plotTop);
                            fa && a.type === "touchstart" && (z(a.target, "isTracker") ? c.runTrackerClick || a.preventDefault() : !c.runChartClick && !l && a.preventDefault());
                            if(l) d < c.plotLeft ? d = c.plotLeft : d > c.plotLeft + c.plotWidth && (d = c.plotLeft + c.plotWidth), h < c.plotTop ? h = c.plotTop : h > c.plotTop + c.plotHeight && (h = c.plotTop + c.plotHeight);
                            if(c.mouseIsDown && a.type !== "touchstart" && (e = Math.sqrt(Math.pow(b.mouseDownX - d, 2) + Math.pow(b.mouseDownY - h, 2)), e > 10)) {
                                var m = c.isInsidePlot(b.mouseDownX - c.plotLeft, b.mouseDownY - c.plotTop);
                                if(c.hasCartesianSeries && (b.zoomX || b.zoomY) && m && !b.selectionMarker) b.selectionMarker = c.renderer.rect(c.plotLeft, c.plotTop, f ? 1 : c.plotWidth, g ? 1 : c.plotHeight, 0).attr({
                                    fill: b.options.chart.selectionMarkerFill || "rgba(69,114,167,0.25)",
                                    zIndex: 7
                                }).add();
                                if(b.selectionMarker && f) {
                                    var p = d - b.mouseDownX;
                                    b.selectionMarker.attr({
                                        width: L(p),
                                        x: (p > 0 ? 0 : p) + b.mouseDownX
                                    })
                                }
                                b.selectionMarker && g && (h -= b.mouseDownY, b.selectionMarker.attr({
                                    height: L(h),
                                    y: (h > 0 ? 0 : h) + b.mouseDownY
                                }));
                                m && !b.selectionMarker && b.options.chart.panning && c.pan(d)
                            }
                            if(!l) b.onmousemove(a);
                            return l || !c.hasCartesianSeries
                        }
                    };
                d.onmousemove = h;
                I(d, "mouseleave", b.hideTooltipOnMouseLeave);
                I(C, "mousemove", b.hideTooltipOnMouseMove);
                d.ontouchstart = function(a) {
                    if(b.zoomX || b.zoomY) d.onmousedown(a);
                    h(a)
                };
                d.ontouchmove = h;
                d.ontouchend = function() {
                    e && b.resetTracker()
                };
                d.onclick = function(a) {
                    var d = c.hoverPoint,
                        e, f, a = b.normalizeMouseEvent(a);
                    a.cancelBubble = !0;
                    if(!c.cancelClick) d && (z(a.target, "isTracker") || z(a.target.parentNode, "isTracker")) ? (e = d.plotX, f = d.plotY, r(d, {
                        pageX: b.chartPosition.left + c.plotLeft + (c.inverted ? c.plotWidth - f : e),
                        pageY: b.chartPosition.top + c.plotTop + (c.inverted ? c.plotHeight - e : f)
                    }), E(d.series, "click", r(a, {
                        point: d
                    })), d.firePointEvent("click", a)) : (r(a, b.getMouseCoordinates(a)), c.isInsidePlot(a.chartX - c.plotLeft, a.chartY - c.plotTop) && E(c, "click", a))
                }
            },
            destroy: function() {
                var a = this.chart,
                    b = a.container;
                if(a.trackerGroup) a.trackerGroup = a.trackerGroup.destroy();
                S(b, "mouseleave", this.hideTooltipOnMouseLeave);
                S(C, "mousemove", this.hideTooltipOnMouseMove);
                b.onclick = b.onmousedown = b.onmousemove = b.ontouchstart = b.ontouchend = b.ontouchmove = null;
                clearInterval(this.tooltipTimeout)
            },
            init: function(a, b) {
                if(!a.trackerGroup) a.trackerGroup = a.renderer.g("tracker").attr({
                    zIndex: 9
                }).add();
                if(b.enabled) a.tooltip = new pb(a, b);
                this.setDOMEvents()
            }
        };
        rb.prototype = {
            init: function(a) {
                var b = this,
                    c = b.options = a.options.legend;
                if(c.enabled) {
                    var d = c.itemStyle,
                        e = o(c.padding, 8),
                        f = c.itemMarginTop || 0;
                    b.baseline = w(d.fontSize) + 3 + f;
                    b.itemStyle = d;
                    b.itemHiddenStyle = A(d, c.itemHiddenStyle);
                    b.itemMarginTop = f;
                    b.padding = e;
                    b.initialItemX = e;
                    b.initialItemY = e - 5;
                    b.maxItemWidth = 0;
                    b.chart = a;
                    b.itemHeight = 0;
                    b.lastLineHeight = 0;
                    b.render();
                    I(b.chart, "endResize", function() {
                        b.positionCheckboxes()
                    })
                }
            },
            colorizeItem: function(a, b) {
                var c = this.options,
                    d = a.legendItem,
                    e = a.legendLine,
                    f = a.legendSymbol,
                    g = this.itemHiddenStyle.color,
                    c = b ? c.itemStyle.color : g,
                    h = b ? a.color : g,
                    g = a.options && a.options.marker,
                    i = {
                        stroke: h,
                        fill: h
                    },
                    j;
                d && d.css({
                    fill: c
                });
                e && e.attr({
                    stroke: h
                });
                if(f) {
                    if(g) for(j in g = a.convertAttribs(g), g)
                    d = g[j], d !== x && (i[j] = d);
                    f.attr(i)
                }
            },
            positionItem: function(a) {
                var b = this.options,
                    c = b.symbolPadding,
                    b = !b.rtl,
                    d = a._legendItemPos,
                    e = d[0],
                    d = d[1],
                    f = a.checkbox;
                a.legendGroup && a.legendGroup.translate(b ? e : this.legendWidth - e - 2 * c - 4, d);
                if(f) f.x = e, f.y = d
            },
            destroyItem: function(a) {
                var b = a.checkbox;
                n(["legendItem", "legendLine", "legendSymbol", "legendGroup"], function(b) {
                    a[b] && a[b].destroy()
                });
                b && Na(a.checkbox)
            },
            destroy: function() {
                var a = this.group,
                    b = this.box;
                if(b) this.box = b.destroy();
                if(a) this.group = a.destroy()
            },
            positionCheckboxes: function() {
                var a = this;
                n(a.allItems, function(b) {
                    var c = b.checkbox,
                        d = a.group.alignAttr;
                    c && H(c, {
                        left: d.translateX + b.legendItemWidth + c.x - 20 + "px",
                        top: d.translateY + c.y + 3 + "px"
                    })
                })
            },
            renderItem: function(a) {
                var u;
                var b = this,
                    c = b.chart,
                    d = c.renderer,
                    e = b.options,
                    f = e.layout === "horizontal",
                    g = e.symbolWidth,
                    h = e.symbolPadding,
                    i = b.itemStyle,
                    j = b.itemHiddenStyle,
                    k = b.padding,
                    l = !e.rtl,
                    m = e.width,
                    p = e.itemMarginBottom || 0,
                    o = b.itemMarginTop,
                    n = b.initialItemX,
                    q = a.legendItem,
                    t = a.series || a,
                    r = t.options,
                    s = r.showCheckbox;
                if(!q && (a.legendGroup = d.g("legend-item").attr({
                    zIndex: 1
                }).add(b.scrollGroup), t.drawLegendSymbol(b, a), a.legendItem = q = d.text(e.labelFormatter.call(a), l ? g + h : -h, b.baseline, e.useHTML).css(A(a.visible ? i : j)).attr({
                    align: l ? "left" : "right",
                    zIndex: 2
                }).add(a.legendGroup), a.legendGroup.on("mouseover", function() {
                    a.setState("hover");
                    q.css(b.options.itemHoverStyle)
                }).on("mouseout", function() {
                    q.css(a.visible ? i : j);
                    a.setState()
                }).on("click", function(b) {
                    var c = function() {
                            a.setVisible()
                        },
                        b = {
                            browserEvent: b
                        };
                    a.firePointEvent ? a.firePointEvent("legendItemClick", b, c) : E(a, "legendItemClick", b, c)
                }), b.colorizeItem(a, a.visible), r && s)) a.checkbox = Q("input", {
                    type: "checkbox",
                    checked: a.selected,
                    defaultChecked: a.selected
                }, e.itemCheckboxStyle, c.container), I(a.checkbox, "click", function(b) {
                    E(a, "checkboxClick", {
                        checked: b.target.checked
                    }, function() {
                        a.select()
                    })
                });
                d = q.getBBox();
                u = a.legendItemWidth = e.itemWidth || g + h + d.width + k + (s ? 20 : 0), e = u;
                b.itemHeight = g = d.height;
                if(f && b.itemX - n + e > (m || c.chartWidth - 2 * k - n)) b.itemX = n, b.itemY += o + b.lastLineHeight + p, b.lastLineHeight = 0;
                b.maxItemWidth = y(b.maxItemWidth, e);
                b.lastItemY = o + b.itemY + p;
                b.lastLineHeight = y(g, b.lastLineHeight);
                a._legendItemPos = [b.itemX, b.itemY];
                f ? b.itemX += e : (b.itemY += o + g + p, b.lastLineHeight = g);
                b.offsetWidth = m || y(f ? b.itemX - n : e, b.offsetWidth)
            },
            render: function() {
                var a = this,
                    b = a.chart,
                    c = b.renderer,
                    d = a.group,
                    e, f, g, h, i = a.box,
                    j = a.options,
                    k = a.padding,
                    l = j.borderWidth,
                    m = j.backgroundColor;
                a.itemX = a.initialItemX;
                a.itemY = a.initialItemY;
                a.offsetWidth = 0;
                a.lastItemY = 0;
                if(!d) a.group = d = c.g("legend").attr({
                    zIndex: 7
                }).add(), a.contentGroup = c.g().attr({
                    zIndex: 1
                }).add(d), a.scrollGroup = c.g().add(a.contentGroup), a.clipRect = c.clipRect(0, 0, 9999, b.chartHeight), a.contentGroup.clip(a.clipRect);
                e = [];
                n(b.series, function(a) {
                    var b = a.options;
                    b.showInLegend && (e = e.concat(a.legendItems || (b.legendType === "point" ? a.data : a)))
                });
                Fb(e, function(a, b) {
                    return(a.options && a.options.legendIndex || 0) - (b.options && b.options.legendIndex || 0)
                });
                j.reversed && e.reverse();
                a.allItems = e;
                a.display = f = !! e.length;
                n(e, function(b) {
                    a.renderItem(b)
                });
                g = j.width || a.offsetWidth;
                h = a.lastItemY + a.lastLineHeight;
                h = a.handleOverflow(h);
                if(l || m) {
                    g += k;
                    h += k;
                    if(i) {
                        if(g > 0 && h > 0) i[i.isNew ? "attr" : "animate"](i.crisp(null, null, null, g, h)), i.isNew = !1
                    } else a.box = i = c.rect(0, 0, g, h, j.borderRadius, l || 0).attr({
                        stroke: j.borderColor,
                        "stroke-width": l || 0,
                        fill: m || R
                    }).add(d).shadow(j.shadow), i.isNew = !0;
                    i[f ? "show" : "hide"]()
                }
                a.legendWidth = g;
                a.legendHeight = h;
                n(e, function(b) {
                    a.positionItem(b)
                });
                f && d.align(r({
                    width: g,
                    height: h
                }, j), !0, b.spacingBox);
                b.isResizing || this.positionCheckboxes()
            },
            handleOverflow: function(a) {
                var b = this,
                    c = this.chart,
                    d = c.renderer,
                    e = this.options,
                    f = e.y,
                    f = c.spacingBox.height + (e.verticalAlign === "top" ? -f : f) - this.padding,
                    g = e.maxHeight,
                    h = this.clipRect,
                    i = e.navigation,
                    j = o(i.animation, !0),
                    k = i.arrowSize || 12,
                    l = this.nav;
                e.layout === "horizontal" && (f /= 2);
                g && (f = O(f, g));
                if(a > f) {
                    this.clipHeight = c = f - 20;
                    this.pageCount = wa(a / c);
                    this.currentPage = o(this.currentPage, 1);
                    this.fullHeight = a;
                    h.attr({
                        height: c
                    });
                    if(!l) this.nav = l = d.g().attr({
                        zIndex: 1
                    }).add(this.group), this.up = d.symbol("triangle", 0, 0, k, k).on("click", function() {
                        b.scroll(-1, j)
                    }).add(l), this.pager = d.text("", 15, 10).css(i.style).add(l), this.down = d.symbol("triangle-down", 0, 0, k, k).on("click", function() {
                        b.scroll(1, j)
                    }).add(l);
                    b.scroll(0);
                    a = f
                } else l && (h.attr({
                    height: c.chartHeight
                }), l.hide(), this.scrollGroup.attr({
                    translateY: 1
                }));
                return a
            },
            scroll: function(a, b) {
                var c = this.pageCount,
                    d = this.currentPage + a,
                    e = this.clipHeight,
                    f = this.options.navigation,
                    g = f.activeColor,
                    f = f.inactiveColor,
                    h = this.pager,
                    i = this.padding;
                d > c && (d = c);
                if(d > 0) b !== x && ua(b, this.chart), this.nav.attr({
                    translateX: i,
                    translateY: e + 7,
                    visibility: "visible"
                }), this.up.attr({
                    fill: d === 1 ? f : g
                }).css({
                    cursor: d === 1 ? "default" : "pointer"
                }), h.attr({
                    text: d + "/" + this.pageCount
                }), this.down.attr({
                    x: 18 + this.pager.getBBox().width,
                    fill: d === c ? f : g
                }).css({
                    cursor: d === c ? "default" : "pointer"
                }), this.scrollGroup.animate({
                    translateY: -O(e * (d - 1), this.fullHeight - e + i) + 1
                }), h.attr({
                    text: d + "/" + c
                }), this.currentPage = d
            }
        };
        sb.prototype = {
            initSeries: function(a) {
                var b = this.options.chart,
                    b = new $[a.type || b.type || b.defaultSeriesType];
                b.init(this, a);
                return b
            },
            addSeries: function(a, b, c) {
                var d, e = this;
                a && (ua(c, e), b = o(b, !0), E(e, "addSeries", {
                    options: a
                }, function() {
                    d = e.initSeries(a);
                    e.isDirtyLegend = !0;
                    b && e.redraw()
                }));
                return d
            },
            isInsidePlot: function(a, b, c) {
                var d = c ? b : a,
                    a = c ? a : b;
                return d >= 0 && d <= this.plotWidth && a >= 0 && a <= this.plotHeight
            },
            adjustTickAmounts: function() {
                this.options.chart.alignTicks !== !1 && n(this.axes, function(a) {
                    a.adjustTickAmount()
                });
                this.maxTicks = null
            },
            redraw: function(a) {
                var b = this.axes,
                    c = this.series,
                    d = this.tracker,
                    e = this.legend,
                    f = this.isDirtyLegend,
                    g, h = this.isDirtyBox,
                    i = c.length,
                    j = i,
                    k = this.renderer,
                    l = k.isHidden(),
                    m = [];
                ua(a, this);
                for(l && this.cloneRenderTo(); j--;)
                if(a = c[j], a.isDirty && a.options.stacking) {
                    g = !0;
                    break
                }
                if(g) for(j = i; j--;)
                if(a = c[j], a.options.stacking) a.isDirty = !0;
                n(c, function(a) {
                    a.isDirty && a.options.legendType === "point" && (f = !0)
                });
                if(f && e.options.enabled) e.render(), this.isDirtyLegend = !1;
                if(this.hasCartesianSeries) {
                    if(!this.isResizing) this.maxTicks = null, n(b, function(a) {
                        a.setScale()
                    });
                    this.adjustTickAmounts();
                    this.getMargins();
                    n(b, function(a) {
                        if(a.isDirtyExtremes) a.isDirtyExtremes = !1, m.push(function() {
                            E(a, "afterSetExtremes", a.getExtremes())
                        });
                        if(a.isDirty || h || g) a.redraw(), h = !0
                    })
                }
                h && this.drawChartBox();
                n(c, function(a) {
                    a.isDirty && a.visible && (!a.isCartesian || a.xAxis) && a.redraw()
                });
                d && d.resetTracker && d.resetTracker(!0);
                k.draw();
                E(this, "redraw");
                l && this.cloneRenderTo(!0);
                n(m, function(a) {
                    a.call()
                })
            },
            showLoading: function(a) {
                var b = this.options,
                    c = this.loadingDiv,
                    d = b.loading;
                if(!c) this.loadingDiv = c = Q(ia, {
                    cNameName: "highcharts-loading"
                }, r(d.style, {
                    left: this.plotLeft + "px",
                    top: this.plotTop + "px",
                    width: this.plotWidth + "px",
                    height: this.plotHeight + "px",
                    zIndex: 10,
                    display: R
                }), this.container), this.loadingSpan = Q("span", null, d.labelStyle, c);
                this.loadingSpan.innerHTML = a || b.lang.loading;
                if(!this.loadingShown) H(c, {
                    opacity: 0,
                    display: ""
                }), xb(c, {
                    opacity: d.style.opacity
                }, {
                    duration: d.showDuration || 0
                }), this.loadingShown = !0
            },
            hideLoading: function() {
                var a = this.options,
                    b = this.loadingDiv;
                b && xb(b, {
                    opacity: 0
                }, {
                    duration: a.loading.hideDuration || 100,
                    complete: function() {
                        H(b, {
                            display: R
                        })
                    }
                });
                this.loadingShown = !1
            },
            get: function(a) {
                var b = this.axes,
                    c = this.series,
                    d, e;
                for(d = 0; d < b.length; d++)
                if(b[d].options.id === a) return b[d];
                for(d = 0; d < c.length; d++)
                if(c[d].options.id === a) return c[d];
                for(d = 0; d < c.length; d++) {
                    e = c[d].points || [];
                    for(b = 0; b < e.length; b++)
                    if(e[b].id === a) return e[b]
                }
                return null
            },
            getAxes: function() {
                var a = this,
                    b = this.options,
                    c = b.xAxis || {},
                    b = b.yAxis || {},
                    c = na(c);
                n(c, function(a, b) {
                    a.index = b;
                    a.isX = !0
                });
                b = na(b);
                n(b, function(a, b) {
                    a.index = b
                });
                c = c.concat(b);
                n(c, function(b) {
                    new ob(a, b)
                });
                a.adjustTickAmounts()
            },
            getSelectedPoints: function() {
                var a = [];
                n(this.series, function(b) {
                    a = a.concat(Kb(b.points, function(a) {
                        return a.selected
                    }))
                });
                return a
            },
            getSelectedSeries: function() {
                return Kb(this.series, function(a) {
                    return a.selected
                })
            },
            showResetZoom: function() {
                var a = this,
                    b = M.lang,
                    c = a.options.chart.resetZoomButton,
                    d = c.theme,
                    e = d.states,
                    f = c.relativeTo === "chart" ? null : "plotBox";
                this.resetZoomButton = a.renderer.button(b.resetZoom, null, null, function() {
                    a.zoomOut()
                }, d, e && e.hover).attr({
                    align: c.position.align,
                    title: b.resetZoomTitle
                }).add().align(c.position, !1, a[f]);
                this.resetZoomButton.alignTo = f
            },
            zoomOut: function() {
                var a = this,
                    b = a.resetZoomButton;
                E(a, "selection", {
                    resetSelection: !0
                }, function() {
                    a.zoom()
                });
                if(b) a.resetZoomButton = b.destroy()
            },
            zoom: function(a) {
                var b = this,
                    c;
                !a || a.resetSelection ? n(b.axes, function(a) {
                    c = a.zoom()
                }) : n(a.xAxis.concat(a.yAxis), function(a) {
                    var e = a.axis;
                    if(b.tracker[e.isXAxis ? "zoomX" : "zoomY"]) c = e.zoom(a.min, a.max)
                });
                b.resetZoomButton || b.showResetZoom();
                c && b.redraw(o(b.options.chart.animation, b.pointCount < 100))
            },
            pan: function(a) {
                var b = this.xAxis[0],
                    c = this.mouseDownX,
                    d = b.pointRange / 2,
                    e = b.getExtremes(),
                    f = b.translate(c - a, !0) + d,
                    c = b.translate(c + this.plotWidth - a, !0) - d;
                (d = this.hoverPoints) && n(d, function(a) {
                    a.setState()
                });
                b.series.length && f > O(e.dataMin, e.min) && c < y(e.dataMax, e.max) && b.setExtremes(f, c, !0, !1, {
                    trigger: "pan"
                });
                this.mouseDownX = a;
                H(this.container, {
                    cursor: "move"
                })
            },
            setTitle: function(a, b) {
                var c = this,
                    d = c.options,
                    e;
                c.chartTitleOptions = e = A(d.title, a);
                c.chartSubtitleOptions = d = A(d.subtitle, b);
                n([
                    ["title", a, e],
                    ["subtitle", b, d]
                ], function(a) {
                    var b = a[0],
                        d = c[b],
                        e = a[1],
                        a = a[2];
                    d && e && (c[b] = d = d.destroy());
                    a && a.text && !d && (c[b] = c.renderer.text(a.text, 0, 0, a.useHTML).attr({
                        align: a.align,
                        "class": "highcharts-" + b,
                        zIndex: a.zIndex || 4
                    }).css(a.style).add().align(a, !1, c.spacingBox))
                })
            },
            getChartSize: function() {
                var a = this.options.chart,
                    b = this.renderToClone || this.renderTo;
                this.containerWidth = db(b, "width");
                this.containerHeight = db(b, "height");
                this.chartWidth = a.width || this.containerWidth || 600;
                this.chartHeight = a.height || (this.containerHeight > 19 ? this.containerHeight : 400)
            },
            cloneRenderTo: function(a) {
                var b = this.renderToClone,
                    c = this.container;
                a ? b && (this.renderTo.appendChild(c), Na(b), delete this.renderToClone) : (c && this.renderTo.removeChild(c), this.renderToClone = b = this.renderTo.cloneNode(0), H(b, {
                    position: "absolute",
                    top: "-9999px",
                    display: "block"
                }), C.body.appendChild(b), c && b.appendChild(c))
            },
            getContainer: function() {
                var a, b = this.options.chart,
                    c, d, e;
                this.renderTo = a = b.renderTo;
                e = "highcharts-" + ub++;
                if(la(a)) this.renderTo = a = C.getElementById(a);
                a || $a(13, !0);
                a.innerHTML = "";
                a.offsetWidth || this.cloneRenderTo();
                this.getChartSize();
                c = this.chartWidth;
                d = this.chartHeight;
                this.container = a = Q(ia, {
                    cNameName: "highcharts-container" + (b.className ? " " + b.className : ""),
                    id: e
                }, r({
                    position: "relative",
                    overflow: "hidden",
                    width: c + "px",
                    height: d + "px",
                    textAlign: "left",
                    lineHeight: "normal",
                    zIndex: 0
                }, b.style), this.renderToClone || a);
                this.renderer = b.forExport ? new ra(a, c, d, !0) : new Ra(a, c, d);
                U && this.renderer.create(this, a, c, d)
            },
            getMargins: function() {
                var a = this.options.chart,
                    b = a.spacingTop,
                    c = a.spacingRight,
                    d = a.spacingBottom,
                    a = a.spacingLeft,
                    e, f = this.legend,
                    g = this.optionsMarginTop,
                    h = this.optionsMarginLeft,
                    i = this.optionsMarginRight,
                    j = this.optionsMarginBottom,
                    k = this.chartTitleOptions,
                    l = this.chartSubtitleOptions,
                    m = this.options.legend,
                    p = o(m.margin, 10),
                    u = m.x,
                    r = m.y,
                    q = m.align,
                    s = m.verticalAlign;
                this.resetMargins();
                e = this.axisOffset;
                if((this.title || this.subtitle) && !t(this.optionsMarginTop)) if(l = y(this.title && !k.floating && !k.verticalAlign && k.y || 0, this.subtitle && !l.floating && !l.verticalAlign && l.y || 0)) this.plotTop = y(this.plotTop, l + o(k.margin, 15) + b);
                if(f.display && !m.floating) if(q === "right") {
                    if(!t(i)) this.marginRight = y(this.marginRight, f.legendWidth - u + p + c)
                } else if(q === "left") {
                    if(!t(h)) this.plotLeft = y(this.plotLeft, f.legendWidth + u + p + a)
                } else if(s === "top") {
                    if(!t(g)) this.plotTop = y(this.plotTop, f.legendHeight + r + p + b)
                } else if(s === "bottom" && !t(j)) this.marginBottom = y(this.marginBottom, f.legendHeight - r + p + d);
                this.extraBottomMargin && (this.marginBottom += this.extraBottomMargin);
                this.extraTopMargin && (this.plotTop += this.extraTopMargin);
                this.hasCartesianSeries && n(this.axes, function(a) {
                    a.getOffset()
                });
                t(h) || (this.plotLeft += e[3]);
                t(g) || (this.plotTop += e[0]);
                t(j) || (this.marginBottom += e[2]);
                t(i) || (this.marginRight += e[1]);
                this.setChartSize()
            },
            initReflow: function() {
                function a(a) {
                    var g = c.width || db(d, "width"),
                        h = c.height || db(d, "height"),
                        a = a ? a.target : K;
                    if(g && h && (a === K || a === C)) {
                        if(g !== b.containerWidth || h !== b.containerHeight) clearTimeout(e), b.reflowTimeout = e = setTimeout(function() {
                            b.container && b.resize(g, h, !1)
                        }, 100);
                        b.containerWidth = g;
                        b.containerHeight = h
                    }
                }
                var b = this,
                    c = b.options.chart,
                    d = b.renderTo,
                    e;
                I(K, "resize", a);
                I(b, "destroy", function() {
                    S(K, "resize", a)
                })
            },
            resize: function(a, b, c) {
                var d = this,
                    e, f, g = d.resetZoomButton,
                    h = d.title,
                    i = d.subtitle,
                    j;
                d.isResizing += 1;
                j = function() {
                    d && E(d, "endResize", null, function() {
                        d.isResizing -= 1
                    })
                };
                ua(c, d);
                d.oldChartHeight = d.chartHeight;
                d.oldChartWidth = d.chartWidth;
                if(t(a)) d.chartWidth = e = s(a);
                if(t(b)) d.chartHeight = f = s(b);
                H(d.container, {
                    width: e + "px",
                    height: f + "px"
                });
                d.renderer.setSize(e, f, c);
                d.plotWidth = e - d.plotLeft - d.marginRight;
                d.plotHeight = f - d.plotTop - d.marginBottom;
                d.maxTicks = null;
                n(d.axes, function(a) {
                    a.isDirty = !0;
                    a.setScale()
                });
                n(d.series, function(a) {
                    a.isDirty = !0
                });
                d.isDirtyLegend = !0;
                d.isDirtyBox = !0;
                d.getMargins();
                a = d.spacingBox;
                h && h.align(null, null, a);
                i && i.align(null, null, a);
                g && g.align && g.align(null, null, d[g.alignTo]);
                d.redraw(c);
                d.oldChartHeight = null;
                E(d, "resize");
                Oa === !1 ? j() : setTimeout(j, Oa && Oa.duration || 500)
            },
            setChartSize: function() {
                var a = this.inverted,
                    b = this.chartWidth,
                    c = this.chartHeight,
                    d = this.options.chart,
                    e = d.spacingTop,
                    f = d.spacingRight,
                    g = d.spacingBottom,
                    h = d.spacingLeft,
                    i, j, k, l;
                this.plotLeft = i = s(this.plotLeft);
                this.plotTop = j = s(this.plotTop);
                this.plotWidth = k = s(b - i - this.marginRight);
                this.plotHeight = l = s(c - j - this.marginBottom);
                this.plotSizeX = a ? l : k;
                this.plotSizeY = a ? k : l;
                this.plotBorderWidth = a = d.plotBorderWidth || 0;
                this.spacingBox = {
                    x: h,
                    y: e,
                    width: b - h - f,
                    height: c - e - g
                };
                this.plotBox = {
                    x: i,
                    y: j,
                    width: k,
                    height: l
                };
                this.clipBox = {
                    x: a / 2,
                    y: a / 2,
                    width: this.plotSizeX - a,
                    height: this.plotSizeY - a
                };
                n(this.axes, function(a) {
                    a.setAxisSize();
                    a.setAxisTranslation()
                })
            },
            resetMargins: function() {
                var a = this.options.chart,
                    b = a.spacingRight,
                    c = a.spacingBottom,
                    d = a.spacingLeft;
                this.plotTop = o(this.optionsMarginTop, a.spacingTop);
                this.marginRight = o(this.optionsMarginRight, b);
                this.marginBottom = o(this.optionsMarginBottom, c);
                this.plotLeft = o(this.optionsMarginLeft, d);
                this.axisOffset = [0, 0, 0, 0]
            },
            drawChartBox: function() {
                var a = this.options.chart,
                    b = this.renderer,
                    c = this.chartWidth,
                    d = this.chartHeight,
                    e = this.chartBackground,
                    f = this.plotBackground,
                    g = this.plotBorder,
                    h = this.plotBGImage,
                    i = a.borderWidth || 0,
                    j = a.backgroundColor,
                    k = a.plotBackgroundColor,
                    l = a.plotBackgroundImage,
                    m = a.plotBorderWidth || 0,
                    p, o = this.plotLeft,
                    n = this.plotTop,
                    q = this.plotWidth,
                    r = this.plotHeight,
                    t = this.plotBox,
                    s = this.clipRect,
                    v = this.clipBox;
                p = i + (a.shadow ? 8 : 0);
                if(i || j) if(e) e.animate(e.crisp(null, null, null, c - p, d - p));
                else {
                    e = {
                        fill: j || R
                    };
                    if(i) e.stroke = a.borderColor, e["stroke-width"] = i;
                    this.chartBackground = b.rect(p / 2, p / 2, c - p, d - p, a.borderRadius, i).attr(e).add().shadow(a.shadow)
                }
                if(k) f ? f.animate(t) : this.plotBackground = b.rect(o, n, q, r, 0).attr({
                    fill: k
                }).add().shadow(a.plotShadow);
                if(l) h ? h.animate(t) : this.plotBGImage = b.image(l, o, n, q, r).add();
                s ? s.animate({
                    width: v.width,
                    height: v.height
                }) : this.clipRect = b.clipRect(v);
                if(m) g ? g.animate(g.crisp(null, o, n, q, r)) : this.plotBorder = b.rect(o, n, q, r, 0, m).attr({
                    stroke: a.plotBorderColor,
                    "stroke-width": m,
                    zIndex: 1
                }).add();
                this.isDirtyBox = !1
            },
            propFromSeries: function() {
                var a = this,
                    b = a.options.chart,
                    c, d = a.options.series,
                    e, f;
                n(["inverted", "angular", "polar"], function(g) {
                    c = $[b.type || b.defaultSeriesType];
                    f = a[g] || b[g] || c && c.prototype[g];
                    for(e = d && d.length; !f && e--;)
                    (c = $[d[e].type]) && c.prototype[g] && (f = !0);
                    a[g] = f
                })
            },
            render: function() {
                var a = this,
                    b = a.axes,
                    c = a.renderer,
                    d = a.options,
                    e = d.labels,
                    d = d.credits,
                    f;
                a.setTitle();
                a.legend = new rb(a);
                n(b, function(a) {
                    a.setScale()
                });
                a.getMargins();
                a.maxTicks = null;
                n(b, function(a) {
                    a.setTickPositions(!0);
                    a.setMaxTicks()
                });
                a.adjustTickAmounts();
                a.getMargins();
                a.drawChartBox();
                a.hasCartesianSeries && n(b, function(a) {
                    a.render()
                });
                if(!a.seriesGroup) a.seriesGroup = c.g("series-group").attr({
                    zIndex: 3
                }).add();
                n(a.series, function(a) {
                    a.translate();
                    a.setTooltipPoints();
                    a.render()
                });
                e.items && n(e.items, function(b) {
                    var d = r(e.style, b.style),
                        f = w(d.left) + a.plotLeft,
                        j = w(d.top) + a.plotTop + 12;
                    delete d.left;
                    delete d.top;
                    c.text(b.html, f, j).attr({
                        zIndex: 2
                    }).css(d).add()
                });
                if(d.enabled && !a.credits) f = d.href, a.credits = c.text(d.text, 0, 0).on("click", function() {
                    if(f) location.href = f
                }).attr({
                    align: d.position.align,
                    zIndex: 8
                }).css(d.style).add().align(d.position);
                a.hasRendered = !0
            },
            destroy: function() {
                var a = this,
                    b = a.axes,
                    c = a.series,
                    d = a.container,
                    e, f = d && d.parentNode;
                E(a, "destroy");
                S(a);
                for(e = b.length; e--;)
                b[e] = b[e].destroy();
                for(e = c.length; e--;)
                c[e] = c[e].destroy();
                n("title,subtitle,chartBackground,plotBackground,plotBGImage,plotBorder,seriesGroup,clipRect,credits,tracker,scroller,rangeSelector,legend,resetZoomButton,tooltip,renderer".split(","), function(b) {
                    var c = a[b];
                    c && c.destroy && (a[b] = c.destroy())
                });
                if(d) d.innerHTML = "", S(d), f && Na(d);
                for(e in a)
                delete a[e]
            },
            firstRender: function() {
                var a = this,
                    b = a.options,
                    c = a.callback;
                if(!Z && K == K.top && C.readyState !== "complete" || U && !K.canvg) U ? Mb.push(function() {
                    a.firstRender()
                }, b.global.canvasToolsURL) : C.attachEvent("onreadystatechange", function() {
                    C.detachEvent("onreadystatechange", a.firstRender);
                    C.readyState === "complete" && a.firstRender()
                });
                else {
                    a.getContainer();
                    E(a, "init");
                    if(Highcharts.RangeSelector && b.rangeSelector.enabled) a.rangeSelector = new Highcharts.RangeSelector(a);
                    a.resetMargins();
                    a.setChartSize();
                    a.propFromSeries();
                    a.getAxes();
                    n(b.series || [], function(b) {
                        a.initSeries(b)
                    });
                    if(Highcharts.Scroller && (b.navigator.enabled || b.scrollbar.enabled)) a.scroller = new Highcharts.Scroller(a);
                    a.tracker = new qb(a, b);
                    a.render();
                    a.renderer.draw();
                    c && c.apply(a, [a]);
                    n(a.callbacks, function(b) {
                        b.apply(a, [a])
                    });
                    a.cloneRenderTo(!0);
                    E(a, "load")
                }
            },
            init: function(a) {
                var b = this.options.chart,
                    c;
                b.reflow !== !1 && I(this, "load", this.initReflow);
                if(a) for(c in a)
                I(this, c, a[c]);
                this.xAxis = [];
                this.yAxis = [];
                this.animation = U ? !1 : o(b.animation, !0);
                this.setSize = this.resize;
                this.pointCount = 0;
                this.counters = new Eb;
                this.firstRender()
            }
        };
        sb.prototype.callbacks = [];
        var Ta = function() {};
        Ta.prototype = {
            init: function(a, b, c) {
                var d = a.chart.counters;
                this.series = a;
                this.applyOptions(b, c);
                this.pointAttr = {};
                if(a.options.colorByPoint) b = a.chart.options.colors, this.color = this.color || b[d.color++], d.wrapColor(b.length);
                a.chart.pointCount++;
                return this
            },
            applyOptions: function(a, b) {
                var c = this.series,
                    d = typeof a;
                this.config = a;
                if(d === "number" || a === null) this.y = a;
                else if(typeof a[0] === "number") this.x = a[0], this.y = a[1];
                else if(d === "object" && typeof a.length !== "number") {
                    r(this, a);
                    this.options = a;
                    if(a.dataLabels) c._hasPointLabels = !0;
                    if(a.marker) c._hasPointMarkers = !0
                } else if(typeof a[0] === "string") this.name = a[0], this.y = a[1];
                if(this.x === x) this.x = b === x ? c.autoIncrement() : b
            },
            destroy: function() {
                var a = this.series.chart,
                    b = a.hoverPoints,
                    c;
                a.pointCount--;
                if(b && (this.setState(), Ba(b, this), !b.length)) a.hoverPoints = null;
                if(this === a.hoverPoint) this.onMouseOut();
                if(this.graphic || this.dataLabel) S(this), this.destroyElements();
                this.legendItem && a.legend.destroyItem(this);
                for(c in this)
                this[c] = null
            },
            destroyElements: function() {
                for(var a = "graphic,tracker,dataLabel,group,connector,shadowGroup".split(","), b, c = 6; c--;)
                b = a[c], this[b] && (this[b] = this[b].destroy())
            },
            getLabelConfig: function() {
                return {
                    x: this.category,
                    y: this.y,
                    key: this.name || this.category,
                    series: this.series,
                    point: this,
                    percentage: this.percentage,
                    total: this.total || this.stackTotal
                }
            },
            select: function(a, b) {
                var c = this,
                    d = c.series.chart,
                    a = o(a, !c.selected);
                c.firePointEvent(a ? "select" : "unselect", {
                    accumulate: b
                }, function() {
                    c.selected = a;
                    c.setState(a && "select");
                    b || n(d.getSelectedPoints(), function(a) {
                        if(a.selected && a !== c) a.selected = !1, a.setState(""), a.firePointEvent("unselect")
                    })
                })
            },
            onMouseOver: function() {
                var a = this.series,
                    b = a.chart,
                    c = b.tooltip,
                    d = b.hoverPoint;
                if(d && d !== this) d.onMouseOut();
                this.firePointEvent("mouseOver");
                c && (!c.shared || a.noSharedTooltip) && c.refresh(this);
                this.setState("hover");
                b.hoverPoint = this
            },
            onMouseOut: function() {
                var a = this.series.chart,
                    b = a.hoverPoints;
                if(!b || Rb(this, b) === -1) this.firePointEvent("mouseOut"), this.setState(), a.hoverPoint = null
            },
            tooltipFormatter: function(a) {
                var b = this.series,
                    c = b.tooltipOptions,
                    d = a.match(/\{(series|point)\.[a-zA-Z]+\}/g),
                    e = /[{\.}]/,
                    f, g, h, i, j = {
                        y: 0,
                        open: 0,
                        high: 0,
                        low: 0,
                        close: 0,
                        percentage: 1,
                        total: 1
                    };
                c.valuePrefix = c.valuePrefix || c.yPrefix;
                c.valueDecimals = c.valueDecimals || c.yDecimals;
                c.valueSuffix = c.valueSuffix || c.ySuffix;
                for(i in d)
                g = d[i], la(g) && g !== a && (h = (" " + g).split(e), f = {
                    point: this,
                    series: b
                }[h[1]], h = h[2], f === this && j.hasOwnProperty(h) ? (f = j[h] ? h : "value", f = (c[f + "Prefix"] || "") + Ia(this[h], o(c[f + "Decimals"], -1)) + (c[f + "Suffix"] || "")) : f = f[h], a = a.replace(g, f));
                return a
            },
            update: function(a, b, c) {
                var d = this,
                    e = d.series,
                    f = d.graphic,
                    g, h = e.data,
                    i = h.length,
                    j = e.chart,
                    b = o(b, !0);
                d.firePointEvent("update", {
                    options: a
                }, function() {
                    d.applyOptions(a);
                    X(a) && (e.getAttribs(), f && f.attr(d.pointAttr[e.state]));
                    for(g = 0; g < i; g++)
                    if(h[g] === d) {
                        e.xData[g] = d.x;
                        e.yData[g] = d.y;
                        e.options.data[g] = a;
                        break
                    }
                    e.isDirty = !0;
                    e.isDirtyData = !0;
                    b && j.redraw(c)
                })
            },
            remove: function(a, b) {
                var c = this,
                    d = c.series,
                    e = d.chart,
                    f, g = d.data,
                    h = g.length;
                ua(b, e);
                a = o(a, !0);
                c.firePointEvent("remove", null, function() {
                    for(f = 0; f < h; f++)
                    if(g[f] === c) {
                        g.splice(f, 1);
                        d.options.data.splice(f, 1);
                        d.xData.splice(f, 1);
                        d.yData.splice(f, 1);
                        break
                    }
                    c.destroy();
                    d.isDirty = !0;
                    d.isDirtyData = !0;
                    a && e.redraw()
                })
            },
            firePointEvent: function(a, b, c) {
                var d = this,
                    e = this.series.options;
                (e.point.events[a] || d.options && d.options.events && d.options.events[a]) && this.importEvents();
                a === "click" && e.allowPointSelect && (c = function(a) {
                    d.select(null, a.ctrlKey || a.metaKey || a.shiftKey)
                });
                E(this, a, b, c)
            },
            importEvents: function() {
                if(!this.hasImportedEvents) {
                    var a = A(this.series.options.point, this.options).events,
                        b;
                    this.events = a;
                    for(b in a)
                    I(this, b, a[b]);
                    this.hasImportedEvents = !0
                }
            },
            setState: function(a) {
                var b = this.plotX,
                    c = this.plotY,
                    d = this.series,
                    e = d.options.states,
                    f = W[d.type].marker && d.options.marker,
                    g = f && !f.enabled,
                    h = f && f.states[a],
                    i = h && h.enabled === !1,
                    j = d.stateMarkerGraphic,
                    k = d.chart,
                    l = this.pointAttr,
                    a = a || "";
                if(!(a === this.state || this.selected && a !== "select" || e[a] && e[a].enabled === !1 || a && (i || g && !h.enabled))) {
                    if(this.graphic) e = f && this.graphic.symbolName && l[a].r, this.graphic.attr(A(l[a], e ? {
                        x: b - e,
                        y: c - e,
                        width: 2 * e,
                        height: 2 * e
                    } : {}));
                    else {
                        if(a && h) e = h.radius, j ? j.attr({
                            x: b - e,
                            y: c - e
                        }) : d.stateMarkerGraphic = j = k.renderer.symbol(d.symbol, b - e, c - e, 2 * e, 2 * e).attr(l[a]).add(d.markerGroup);
                        if(j) j[a && k.isInsidePlot(b, c) ? "show" : "hide"]()
                    }
                    this.state = a
                }
            }
        };
        var N = function() {};
        N.prototype = {
            isCartesian: !0,
            type: "line",
            pointClass: Ta,
            sorted: !0,
            pointAttrToOptions: {
                stroke: "lineColor",
                "stroke-width": "lineWidth",
                fill: "fillColor",
                r: "radius"
            },
            init: function(a, b) {
                var c, d;
                this.chart = a;
                this.options = b = this.setOptions(b);
                this.bindAxes();
                r(this, {
                    name: b.name,
                    state: "",
                    pointAttr: {},
                    visible: b.visible !== !1,
                    selected: b.selected === !0
                });
                if(U) b.animation = !1;
                d = b.events;
                for(c in d)
                I(this, c, d[c]);
                if(d && d.click || b.point && b.point.events && b.point.events.click || b.allowPointSelect) a.runTrackerClick = !0;
                this.getColor();
                this.getSymbol();
                this.setData(b.data, !1);
                if(this.isCartesian) a.hasCartesianSeries = !0;
                a.series.push(this);
                Fb(a.series, function(a, b) {
                    return(a.options.index || 0) - (b.options.index || 0)
                });
                n(a.series, function(a, b) {
                    a.index = b;
                    a.name = a.name || "Series " + (b + 1)
                })
            },
            bindAxes: function() {
                var a = this,
                    b = a.options,
                    c = a.chart,
                    d;
                a.isCartesian && n(["xAxis", "yAxis"], function(e) {
                    n(c[e], function(c) {
                        d = c.options;
                        if(b[e] === d.index || b[e] === x && d.index === 0) c.series.push(a), a[e] = c, c.isDirty = !0
                    })
                })
            },
            autoIncrement: function() {
                var a = this.options,
                    b = this.xIncrement,
                    b = o(b, a.pointStart, 0);
                this.pointInterval = o(this.pointInterval, a.pointInterval, 1);
                this.xIncrement = b + this.pointInterval;
                return b
            },
            getSegments: function() {
                var a = -1,
                    b = [],
                    c, d = this.points,
                    e = d.length;
                if(e) if(this.options.connectNulls) {
                    for(c = e; c--;)
                    d[c].y === null && d.splice(c, 1);
                    d.length && (b = [d])
                } else n(d, function(c, g) {
                    c.y === null ? (g > a + 1 && b.push(d.slice(a + 1, g)), a = g) : g === e - 1 && b.push(d.slice(a + 1, g + 1))
                });
                this.segments = b
            },
            setOptions: function(a) {
                var b = this.chart.options,
                    c = b.plotOptions,
                    d = c[this.type],
                    e = a.data;
                a.data = null;
                c = A(d, c.series, a);
                c.data = a.data = e;
                this.tooltipOptions = A(b.tooltip, c.tooltip);
                d.marker === null && delete c.marker;
                return c
            },
            getColor: function() {
                var a = this.options,
                    b = this.chart.options.colors,
                    c = this.chart.counters;
                this.color = a.color || !a.colorByPoint && b[c.color++] || "gray";
                c.wrapColor(b.length)
            },
            getSymbol: function() {
                var a = this.options.marker,
                    b = this.chart,
                    c = b.options.symbols,
                    b = b.counters;
                this.symbol = a.symbol || c[b.symbol++];
                if(/^url/.test(this.symbol)) a.radius = 0;
                b.wrapSymbol(c.length)
            },
            drawLegendSymbol: function(a) {
                var b = this.options,
                    c = b.marker,
                    d = a.options.symbolWidth,
                    e = this.chart.renderer,
                    f = this.legendGroup,
                    a = a.baseline,
                    g;
                if(b.lineWidth) {
                    g = {
                        "stroke-width": b.lineWidth
                    };
                    if(b.dashStyle) g.dashstyle = b.dashStyle;
                    this.legendLine = e.path(["M", 0, a - 4, "L", d, a - 4]).attr(g).add(f)
                }
                if(c && c.enabled) b = c.radius, this.legendSymbol = e.symbol(this.symbol, d / 2 - b, a - 4 - b, 2 * b, 2 * b).add(f)
            },
            addPoint: function(a, b, c, d) {
                var e = this.data,
                    f = this.graph,
                    g = this.area,
                    h = this.chart,
                    i = this.xData,
                    j = this.yData,
                    k = f && f.shift || 0,
                    l = this.options.data,
                    m = this.pointClass.prototype;
                ua(d, h);
                if(f && c) f.shift = k + 1;
                if(g) {
                    if(c) g.shift = k + 1;
                    g.isArea = !0
                }
                b = o(b, !0);
                d = {
                    series: this
                };
                m.applyOptions.apply(d, [a]);
                i.push(d.x);
                j.push(m.toYData ? m.toYData.call(d) : d.y);
                l.push(a);
                c && (e[0] && e[0].remove ? e[0].remove(!1) : (e.shift(), i.shift(), j.shift(), l.shift()));
                this.getAttribs();
                this.isDirtyData = this.isDirty = !0;
                b && h.redraw()
            },
            setData: function(a, b) {
                var c = this.points,
                    d = this.options,
                    e = this.initialColor,
                    f = this.chart,
                    g = null,
                    h = this.xAxis,
                    i, j = this.pointClass.prototype;
                this.xIncrement = null;
                this.pointRange = h && h.categories ? 1 : d.pointRange;
                if(t(e)) f.counters.color = e;
                var e = [],
                    k = [],
                    l = a ? a.length : [],
                    m = (i = this.pointArrayMap) && i.length;
                if(l > (d.turboThreshold || 1E3)) {
                    for(i = 0; g === null && i < l;)
                    g = a[i], i++;
                    if(Aa(g)) {
                        j = o(d.pointStart, 0);
                        d = o(d.pointInterval, 1);
                        for(i = 0; i < l; i++)
                        e[i] = j, k[i] = a[i], j += d;
                        this.xIncrement = j
                    } else if(Ha(g)) if(m) for(i = 0; i < l; i++)
                    d = a[i], e[i] = d[0], k[i] = d.slice(1, m + 1);
                    else for(i = 0; i < l; i++)
                    d = a[i], e[i] = d[0], k[i] = d[1]
                } else for(i = 0; i < l; i++)
                d = {
                    series: this
                }, j.applyOptions.apply(d, [a[i]]), e[i] = d.x, k[i] = j.toYData ? j.toYData.call(d) : d.y;
                la(k[0]) && $a(14, !0);
                this.data = [];
                this.options.data = a;
                this.xData = e;
                this.yData = k;
                for(i = c && c.length || 0; i--;)
                c[i] && c[i].destroy && c[i].destroy();
                if(h) h.minRange = h.userMinRange;
                this.isDirty = this.isDirtyData = f.isDirtyBox = !0;
                o(b, !0) && f.redraw(!1)
            },
            remove: function(a, b) {
                var c = this,
                    d = c.chart,
                    a = o(a, !0);
                if(!c.isRemoving) c.isRemoving = !0, E(c, "remove", null, function() {
                    c.destroy();
                    d.isDirtyLegend = d.isDirtyBox = !0;
                    a && d.redraw(b)
                });
                c.isRemoving = !1
            },
            processData: function(a) {
                var b = this.xData,
                    c = this.yData,
                    d = b.length,
                    e = 0,
                    f = d,
                    g, h, i = this.xAxis,
                    j = this.options,
                    k = j.cropThreshold,
                    l = this.isCartesian;
                if(l && !this.isDirty && !i.isDirty && !this.yAxis.isDirty && !a) return !1;
                if(l && this.sorted && (!k || d > k || this.forceCrop)) if(a = i.getExtremes(), i = a.min, k = a.max, b[d - 1] < i || b[0] > k) b = [], c = [];
                else if(b[0] < i || b[d - 1] > k) {
                    for(a = 0; a < d; a++)
                    if(b[a] >= i) {
                        e = y(0, a - 1);
                        break
                    }
                    for(; a < d; a++)
                    if(b[a] > k) {
                        f = a + 1;
                        break
                    }
                    b = b.slice(e, f);
                    c = c.slice(e, f);
                    g = !0
                }
                for(a = b.length - 1; a > 0; a--)
                if(d = b[a] - b[a - 1], d > 0 && (h === x || d < h)) h = d;
                this.cropped = g;
                this.cropStart = e;
                this.processedXData = b;
                this.processedYData = c;
                if(j.pointRange === null) this.pointRange = h || 1;
                this.closestPointRange = h
            },
            generatePoints: function() {
                var a = this.options.data,
                    b = this.data,
                    c, d = this.processedXData,
                    e = this.processedYData,
                    f = this.pointClass,
                    g = d.length,
                    h = this.cropStart || 0,
                    i, j = this.hasGroupedData,
                    k, l = [],
                    m;
                if(!b && !j) b = [], b.length = a.length, b = this.data = b;
                for(m = 0; m < g; m++)
                i = h + m, j ? l[m] = (new f).init(this, [d[m]].concat(na(e[m]))) : (b[i] ? k = b[i] : a[i] !== x && (b[i] = k = (new f).init(this, a[i], d[m])), l[m] = k);
                if(b && (g !== (c = b.length) || j)) for(m = 0; m < c; m++)
                if(m === h && !j && (m += g), b[m]) b[m].destroyElements(), b[m].plotX = x;
                this.data = b;
                this.points = l
            },
            translate: function() {
                this.processedXData || this.processData();
                this.generatePoints();
                for(var a = this.chart, b = this.options, c = b.stacking, d = this.xAxis, e = d.categories, f = this.yAxis, g = this.points, h = g.length, i = !! this.modifyValue, j, k = f.series, l = k.length, m = b.pointPlacement === "between"; l--;)
                if(k[l].visible) {
                    k[l] === this && (j = !0);
                    break
                }
                for(l = 0; l < h; l++) {
                    var k = g[l],
                        p = k.x,
                        n = k.y,
                        r = k.low,
                        q = f.stacks[(n < b.threshold ? "-" : "") + this.stackKey];
                    k.plotX = d.translate(p, 0, 0, 0, 1, m);
                    if(c && this.visible && q && q[p]) r = q[p], p = r.total, r.cum = r = r.cum - n, n = r + n, j && (r = o(b.threshold, f.min)), f.isLog && r <= 0 && (r = null), c === "percent" && (r = p ? r * 100 / p : 0, n = p ? n * 100 / p : 0), k.percentage = p ? k.y * 100 / p : 0, k.total = k.stackTotal = p, k.stackY = n;
                    k.yBottom = t(r) ? f.translate(r, 0, 1, 0, 1) : null;
                    i && (n = this.modifyValue(n, k));
                    k.plotY = typeof n === "number" ? s(f.translate(n, 0, 1, 0, 1) * 10) / 10 : x;
                    k.clientX = a.inverted ? a.plotHeight - k.plotX : k.plotX;
                    k.category = e && e[k.x] !== x ? e[k.x] : k.x
                }
                this.getSegments()
            },
            setTooltipPoints: function(a) {
                var b = [],
                    c, d, e = (c = this.xAxis) ? c.tooltipLen || c.len : this.chart.plotSizeX,
                    f = c && c.tooltipPosName || "plotX",
                    g, h, i = [];
                if(this.options.enableMouseTracking !== !1) {
                    if(a) this.tooltipPoints = null;
                    n(this.segments || this.points, function(a) {
                        b = b.concat(a)
                    });
                    c && c.reversed && (b = b.reverse());
                    a = b.length;
                    for(h = 0; h < a; h++) {
                        g = b[h];
                        c = b[h - 1] ? d + 1 : 0;
                        for(d = b[h + 1] ? y(0, T((g[f] + (b[h + 1] ? b[h + 1][f] : e)) / 2)) : e; c >= 0 && c <= d;)
                        i[c++] = g
                    }
                    this.tooltipPoints = i
                }
            },
            tooltipHeaderFormatter: function(a) {
                var b = this.tooltipOptions,
                    c = b.xDateFormat,
                    d = this.xAxis,
                    e = d && d.options.type === "datetime",
                    f;
                if(e && !c) for(f in B)
                if(B[f] >= d.closestPointRange) {
                    c = b.dateTimeLabelFormats[f];
                    break
                }
                return b.headerFormat.replace("{point.key}", e && Aa(a) ? cb(c, a) : a).replace("{series.name}", this.name).replace("{series.color}", this.color)
            },
            onMouseOver: function() {
                var a = this.chart,
                    b = a.hoverSeries;
                if(b && b !== this) b.onMouseOut();
                this.options.events.mouseOver && E(this, "mouseOver");
                this.setState("hover");
                a.hoverSeries = this
            },
            onMouseOut: function() {
                var a = this.options,
                    b = this.chart,
                    c = b.tooltip,
                    d = b.hoverPoint;
                if(d) d.onMouseOut();
                this && a.events.mouseOut && E(this, "mouseOut");
                c && !a.stickyTracking && !c.shared && c.hide();
                this.setState();
                b.hoverSeries = null
            },
            animate: function(a) {
                var b = this,
                    c = b.chart,
                    d = c.renderer,
                    e;
                e = b.options.animation;
                var f = c.clipBox,
                    g = c.inverted,
                    h;
                if(e && !X(e)) e = W[b.type].animation;
                h = "_sharedClip" + e.duration + e.easing;
                if(a) a = c[h], e = c[h + "m"], a || (c[h] = a = d.clipRect(r(f, {
                    width: 0
                })), c[h + "m"] = e = d.clipRect(-99, g ? -c.plotLeft : -c.plotTop, 99, g ? c.chartWidth : c.chartHeight)), b.group.clip(a), b.markerGroup.clip(e), b.sharedClipKey = h;
                else {
                    if(a = c[h]) a.animate({
                        width: c.plotSizeX
                    }, e), c[h + "m"].animate({
                        width: c.plotSizeX + 99
                    }, e);
                    b.animate = null;
                    b.animationTimeout = setTimeout(function() {
                        b.afterAnimate()
                    }, e.duration)
                }
            },
            afterAnimate: function() {
                var a = this.chart,
                    b = this.sharedClipKey,
                    c = this.group;
                c && this.options.clip !== !1 && (c.clip(a.clipRect), this.markerGroup.clip());
                setTimeout(function() {
                    b && a[b] && (a[b] = a[b].destroy(), a[b + "m"] = a[b + "m"].destroy())
                }, 100)
            },
            drawPoints: function() {
                var a, b = this.points,
                    c = this.chart,
                    d, e, f, g, h, i, j, k, l = this.options.marker,
                    m, p = this.markerGroup;
                if(l.enabled || this._hasPointMarkers) for(f = b.length; f--;)
                if(g = b[f], d = g.plotX, e = g.plotY, k = g.graphic, i = g.marker || {}, a = l.enabled && i.enabled === x || i.enabled, m = c.isInsidePlot(d, e, c.inverted), a && e !== x && !isNaN(e)) if(a = g.pointAttr[g.selected ? "select" : ""], h = a.r, i = o(i.symbol, this.symbol), j = i.indexOf("url") === 0, k) k.attr({
                    visibility: m ? Z ? "inherit" : "visible" : "hidden"
                }).animate(r({
                    x: d - h,
                    y: e - h
                }, k.symbolName ? {
                    width: 2 * h,
                    height: 2 * h
                } : {}));
                else {
                    if(m && (h > 0 || j)) g.graphic = c.renderer.symbol(i, d - h, e - h, 2 * h, 2 * h).attr(a).add(p)
                } else if(k) g.graphic = k.destroy()
            },
            convertAttribs: function(a, b, c, d) {
                var e = this.pointAttrToOptions,
                    f, g, h = {},
                    a = a || {},
                    b = b || {},
                    c = c || {},
                    d = d || {};
                for(f in e)
                g = e[f], h[f] = o(a[g], b[f], c[f], d[f]);
                return h
            },
            getAttribs: function() {
                var a = this,
                    b = W[a.type].marker ? a.options.marker : a.options,
                    c = b.states,
                    d = c.hover,
                    e, f = a.color,
                    g = {
                        stroke: f,
                        fill: f
                    },
                    h = a.points || [],
                    i = [],
                    j, k = a.pointAttrToOptions,
                    l;
                a.options.marker ? (d.radius = d.radius || b.radius + 2, d.lineWidth = d.lineWidth || b.lineWidth + 1) : d.color = d.color || qa(d.color || f).brighten(d.brightness).get();
                i[""] = a.convertAttribs(b, g);
                n(["hover", "select"], function(b) {
                    i[b] = a.convertAttribs(c[b], i[""])
                });
                a.pointAttr = i;
                for(f = h.length; f--;) {
                    g = h[f];
                    if((b = g.options && g.options.marker || g.options) && b.enabled === !1) b.radius = 0;
                    e = a.options.colorByPoint;
                    if(g.options) for(l in k)
                    t(b[k[l]]) && (e = !0);
                    if(e) {
                        b = b || {};
                        j = [];
                        c = b.states || {};
                        e = c.hover = c.hover || {};
                        if(!a.options.marker) e.color = qa(e.color || g.color).brighten(e.brightness || d.brightness).get();
                        j[""] = a.convertAttribs(r({
                            color: g.color
                        }, b), i[""]);
                        j.hover = a.convertAttribs(c.hover, i.hover, j[""]);
                        j.select = a.convertAttribs(c.select, i.select, j[""])
                    } else j = i;
                    g.pointAttr = j
                }
            },
            destroy: function() {
                var a = this,
                    b = a.chart,
                    c = /AppleWebKit\/533/.test(Fa),
                    d, e, f = a.data || [],
                    g, h, i;
                E(a, "destroy");
                S(a);
                n(["xAxis", "yAxis"], function(b) {
                    if(i = a[b]) Ba(i.series, a), i.isDirty = !0
                });
                a.legendItem && a.chart.legend.destroyItem(a);
                for(e = f.length; e--;)
                (g = f[e]) && g.destroy && g.destroy();
                a.points = null;
                clearTimeout(a.animationTimeout);
                n("area,graph,dataLabelsGroup,group,markerGroup,tracker,trackerGroup".split(","), function(b) {
                    a[b] && (d = c && b === "group" ? "hide" : "destroy", a[b][d]())
                });
                if(b.hoverSeries === a) b.hoverSeries = null;
                Ba(b.series, a);
                for(h in a)
                delete a[h]
            },
            drawDataLabels: function() {
                var a = this,
                    b = a.options.dataLabels,
                    c = a.points,
                    d, e, f, g;
                if(b.enabled || a._hasPointLabels) a.dlProcessOptions && a.dlProcessOptions(b), g = a.plotGroup("dataLabelsGroup", "data-labels", a.visible ? "visible" : "hidden", 6), e = b, n(c, function(c) {
                    var i, j = c.dataLabel,
                        k, l = !0;
                    d = c.options && c.options.dataLabels;
                    i = e.enabled || d && d.enabled;
                    if(j && !i) c.dataLabel = j.destroy();
                    else if(i) {
                        i = b.rotation;
                        b = A(e, d);
                        f = b.formatter.call(c.getLabelConfig(), b);
                        b.style.color = o(b.color, b.style.color, a.color, "black");
                        if(j) j.attr({
                            text: f
                        }), l = !1;
                        else if(t(f)) {
                            j = {
                                fill: b.backgroundColor,
                                stroke: b.borderColor,
                                "stroke-width": b.borderWidth,
                                r: b.borderRadius || 0,
                                rotation: i,
                                padding: b.padding,
                                zIndex: 1
                            };
                            for(k in j)
                            j[k] === x && delete j[k];
                            j = c.dataLabel = a.chart.renderer[i ? "text" : "label"](f, 0, -999, null, null, null, b.useHTML).attr(j).css(b.style).add(g).shadow(b.shadow)
                        }
                        j && a.alignDataLabel(c, j, b, null, l)
                    }
                })
            },
            alignDataLabel: function(a, b, c, d, e) {
                var f = this.chart,
                    g = f.inverted,
                    h = o(a.plotX, -999),
                    a = o(a.plotY, -999),
                    i = b.getBBox(),
                    d = r({
                        x: g ? f.plotWidth - a : h,
                        y: s(g ? f.plotHeight - h : a),
                        width: 0,
                        height: 0
                    }, d);
                r(c, {
                    width: i.width,
                    height: i.height
                });
                c.rotation ? (d = {
                    align: c.align,
                    x: d.x + c.x + d.width / 2,
                    y: d.y + c.y + d.height / 2
                }, b[e ? "attr" : "animate"](d)) : (b.align(c, null, d), d = b.alignAttr);
                b.attr({
                    visibility: c.crop === !1 || f.isInsidePlot(d.x, d.y) || f.isInsidePlot(h, a, g) ? Z ? "inherit" : "visible" : "hidden"
                })
            },
            getSegmentPath: function(a) {
                var b = this,
                    c = [];
                n(a, function(d, e) {
                    b.getPointSpline ? c.push.apply(c, b.getPointSpline(a, d, e)) : (c.push(e ? "L" : "M"), e && b.options.step && c.push(d.plotX, a[e - 1].plotY), c.push(d.plotX, d.plotY))
                });
                return c
            },
            getGraphPath: function() {
                var a = this,
                    b = [],
                    c, d = [];
                n(a.segments, function(e) {
                    c = a.getSegmentPath(e);
                    e.length > 1 ? b = b.concat(c) : d.push(e[0])
                });
                a.singlePoints = d;
                return a.graphPath = b
            },
            drawGraph: function() {
                var a = this.options,
                    b = this.graph,
                    c = this.group,
                    d = a.lineColor || this.color,
                    e = a.lineWidth,
                    f = a.dashStyle,
                    g = this.getGraphPath();
                if(b) eb(b), b.animate({
                    d: g
                });
                else if(e) {
                    b = {
                        stroke: d,
                        "stroke-width": e,
                        zIndex: 1
                    };
                    if(f) b.dashstyle = f;
                    this.graph = this.chart.renderer.path(g).attr(b).add(c).shadow(a.shadow)
                }
            },
            invertGroups: function() {
                function a() {
                    var a = {
                        width: b.yAxis.len,
                        height: b.xAxis.len
                    };
                    n(["group", "trackerGroup", "markerGroup"], function(c) {
                        b[c] && b[c].attr(a).invert()
                    })
                }
                var b = this,
                    c = b.chart;
                I(c, "resize", a);
                I(b, "destroy", function() {
                    S(c, "resize", a)
                });
                a();
                b.invertGroups = a
            },
            plotGroup: function(a, b, c, d, e) {
                var f = this[a],
                    g = this.chart,
                    h = this.xAxis,
                    i = this.yAxis;
                f || (this[a] = f = g.renderer.g(b).attr({
                    visibility: c,
                    zIndex: d || 0.1
                }).add(e));
                f.translate(h ? h.left : g.plotLeft, i ? i.top : g.plotTop);
                return f
            },
            render: function() {
                var a = this.chart,
                    b, c = this.options,
                    d = c.animation && !! this.animate,
                    e = this.visible ? "visible" : "hidden",
                    f = c.zIndex,
                    g = this.hasRendered,
                    h = a.seriesGroup;
                b = this.plotGroup("group", "series", e, f, h);
                this.markerGroup = this.plotGroup("markerGroup", "markers", e, f, h);
                d && this.animate(!0);
                this.getAttribs();
                b.inverted = a.inverted;
                this.drawGraph && this.drawGraph();
                this.drawPoints();
                this.drawDataLabels();
                this.options.enableMouseTracking !== !1 && this.drawTracker();
                a.inverted && this.invertGroups();
                c.clip !== !1 && !this.sharedClipKey && !g && (b.clip(a.clipRect), this.trackerGroup && this.trackerGroup.clip(a.clipRect));
                d ? this.animate() : g || this.afterAnimate();
                this.isDirty = this.isDirtyData = !1;
                this.hasRendered = !0
            },
            redraw: function() {
                var a = this.chart,
                    b = this.isDirtyData,
                    c = this.group;
                c && (a.inverted && c.attr({
                    width: a.plotWidth,
                    height: a.plotHeight
                }), c.animate({
                    translateX: this.xAxis.left,
                    translateY: this.yAxis.top
                }));
                this.translate();
                this.setTooltipPoints(!0);
                this.render();
                b && E(this, "updatedData")
            },
            setState: function(a) {
                var b = this.options,
                    c = this.graph,
                    d = b.states,
                    b = b.lineWidth,
                    a = a || "";
                if(this.state !== a) this.state = a, d[a] && d[a].enabled === !1 || (a && (b = d[a].lineWidth || b + 1), c && !c.dashstyle && c.attr({
                    "stroke-width": b
                }, a ? 0 : 500))
            },
            setVisible: function(a, b) {
                var c = this.chart,
                    d = this.legendItem,
                    e = this.group,
                    f = this.tracker,
                    g = this.dataLabelsGroup,
                    h = this.markerGroup,
                    i, j = this.points,
                    k = c.options.chart.ignoreHiddenSeries;
                i = this.visible;
                i = (this.visible = a = a === x ? !i : a) ? "show" : "hide";
                if(e) e[i]();
                if(h) h[i]();
                if(f) f[i]();
                else if(j) for(e = j.length; e--;)
                if(f = j[e], f.tracker) f.tracker[i]();
                if(g) g[i]();
                d && c.legend.colorizeItem(this, a);
                this.isDirty = !0;
                this.options.stacking && n(c.series, function(a) {
                    if(a.options.stacking && a.visible) a.isDirty = !0
                });
                if(k) c.isDirtyBox = !0;
                b !== !1 && c.redraw();
                E(this, i)
            },
            show: function() {
                this.setVisible(!0)
            },
            hide: function() {
                this.setVisible(!1)
            },
            select: function(a) {
                this.selected = a = a === x ? !this.selected : a;
                if(this.checkbox) this.checkbox.checked = a;
                E(this, a ? "select" : "unselect")
            },
            drawTracker: function() {
                var a = this,
                    b = a.options,
                    c = b.trackByArea,
                    d = [].concat(c ? a.areaPath : a.graphPath),
                    e = d.length,
                    f = a.chart,
                    g = f.renderer,
                    h = f.options.tooltip.snap,
                    i = a.tracker,
                    j = b.cursor,
                    j = j && {
                        cursor: j
                    },
                    k = a.singlePoints,
                    l = this.isCartesian && this.plotGroup("trackerGroup", null, "visible", b.zIndex || 1, f.trackerGroup),
                    m;
                if(e && !c) for(m = e + 1; m--;)
                d[m] === "M" && d.splice(m + 1, 0, d[m + 1] - h, d[m + 2], "L"), (m && d[m] === "M" || m === e) && d.splice(m, 0, "L", d[m - 2] + h, d[m - 1]);
                for(m = 0; m < k.length; m++)
                e = k[m], d.push("M", e.plotX - h, e.plotY, "L", e.plotX + h, e.plotY);
                i ? i.attr({
                    d: d
                }) : a.tracker = g.path(d).attr({
                    isTracker: !0,
                    "stroke-linejoin": "bevel",
                    visibility: a.visible ? "visible" : "hidden",
                    stroke: wb,
                    fill: c ? wb : R,
                    "stroke-width": b.lineWidth + (c ? 0 : 2 * h)
                }).on(fa ? "touchstart" : "mouseover", function() {
                    if(f.hoverSeries !== a) a.onMouseOver()
                }).on("mouseout", function() {
                    if(!b.stickyTracking) a.onMouseOut()
                }).css(j).add(l)
            }
        };
        G = ca(N);
        $.line = G;
        W.area = A(ga, {
            threshold: 0
        });
        G = ca(N, {
            type: "area",
            getSegmentPath: function(a) {
                var b = N.prototype.getSegmentPath.call(this, a),
                    c = [].concat(b),
                    d, e = this.options;
                b.length === 3 && c.push("L", b[1], b[2]);
                if(e.stacking && !this.closedStacks) for(d = a.length - 1; d >= 0; d--)
                d < a.length - 1 && e.step && c.push(a[d + 1].plotX, a[d].yBottom), c.push(a[d].plotX, a[d].yBottom);
                else this.closeSegment(c, a);
                this.areaPath = this.areaPath.concat(c);
                return b
            },
            closeSegment: function(a, b) {
                var c = this.yAxis.getThreshold(this.options.threshold);
                a.push("L", b[b.length - 1].plotX, c, "L", b[0].plotX, c)
            },
            drawGraph: function() {
                this.areaPath = [];
                N.prototype.drawGraph.apply(this);
                var a = this.areaPath,
                    b = this.options,
                    c = this.area;
                c ? c.animate({
                    d: a
                }) : this.area = this.chart.renderer.path(a).attr({
                    fill: o(b.fillColor, qa(this.color).setOpacity(b.fillOpacity || 0.75).get()),
                    zIndex: 0
                }).add(this.group)
            },
            drawLegendSymbol: function(a, b) {
                b.legendSymbol = this.chart.renderer.rect(0, a.baseline - 11, a.options.symbolWidth, 12, 2).attr({
                    zIndex: 3
                }).add(b.legendGroup)
            }
        });
        $.area = G;
        W.spline = A(ga);
        ha = ca(N, {
            type: "spline",
            getPointSpline: function(a, b, c) {
                var d = b.plotX,
                    e = b.plotY,
                    f = a[c - 1],
                    g = a[c + 1],
                    h, i, j, k;
                if(f && g) {
                    a = f.plotY;
                    j = g.plotX;
                    var g = g.plotY,
                        l;
                    h = (1.5 * d + f.plotX) / 2.5;
                    i = (1.5 * e + a) / 2.5;
                    j = (1.5 * d + j) / 2.5;
                    k = (1.5 * e + g) / 2.5;
                    l = (k - i) * (j - d) / (j - h) + e - k;
                    i += l;
                    k += l;
                    i > a && i > e ? (i = y(a, e), k = 2 * e - i) : i < a && i < e && (i = O(a, e), k = 2 * e - i);
                    k > g && k > e ? (k = y(g, e), i = 2 * e - k) : k < g && k < e && (k = O(g, e), i = 2 * e - k);
                    b.rightContX = j;
                    b.rightContY = k
                }
                c ? (b = ["C", f.rightContX || f.plotX, f.rightContY || f.plotY, h || d, i || e, d, e], f.rightContX = f.rightContY = null) : b = ["M", d, e];
                return b
            }
        });
        $.spline = ha;
        W.areaspline = A(W.area);
        var za = G.prototype,
            ha = ca(ha, {
                type: "areaspline",
                closedStacks: !0,
                getSegmentPath: za.getSegmentPath,
                closeSegment: za.closeSegment,
                drawGraph: za.drawGraph
            });
        $.areaspline = ha;
        W.column = A(ga, {
            borderColor: "#FFFFFF",
            borderWidth: 1,
            borderRadius: 0,
            groupPadding: 0.2,
            marker: null,
            pointPadding: 0.1,
            minPointLength: 0,
            cropThreshold: 50,
            pointRange: null,
            states: {
                hover: {
                    brightness: 0.1,
                    shadow: !1
                },
                select: {
                    color: "#C0C0C0",
                    borderColor: "#000000",
                    shadow: !1
                }
            },
            dataLabels: {
                align: null,
                verticalAlign: null,
                y: null
            },
            threshold: 0
        });
        ha = ca(N, {
            type: "column",
            tooltipOutsidePlot: !0,
            pointAttrToOptions: {
                stroke: "borderColor",
                "stroke-width": "borderWidth",
                fill: "color",
                r: "borderRadius"
            },
            init: function() {
                N.prototype.init.apply(this, arguments);
                var a = this,
                    b = a.chart;
                b.hasRendered && n(b.series, function(b) {
                    if(b.type === a.type) b.isDirty = !0
                })
            },
            translate: function() {
                var a = this,
                    b = a.chart,
                    c = a.options,
                    d = c.stacking,
                    e = c.borderWidth,
                    f = 0,
                    g = a.xAxis,
                    h = g.reversed,
                    i = {},
                    j, k;
                N.prototype.translate.apply(a);
                c.grouping === !1 ? f = 1 : n(b.series, function(b) {
                    var c = b.options;
                    if(b.type === a.type && b.visible && a.options.group === c.group) c.stacking ? (j = b.stackKey, i[j] === x && (i[j] = f++), k = i[j]) : c.grouping !== !1 && (k = f++), b.columnIndex = k
                });
                var l = a.points,
                    g = L(g.transA) * (g.ordinalSlope || c.pointRange || g.closestPointRange || 1),
                    m = g * c.groupPadding,
                    p = (g - 2 * m) / f,
                    u = c.pointWidth,
                    r = t(u) ? (p - u) / 2 : p * c.pointPadding,
                    q = o(u, p - 2 * r),
                    s = wa(y(q, 1 + 2 * e)),
                    w = r + (m + ((h ? f - a.columnIndex : a.columnIndex) || 0) * p - g / 2) * (h ? -1 : 1),
                    z = a.translatedThreshold = a.yAxis.getThreshold(c.threshold),
                    v = o(c.minPointLength, 5);
                n(l, function(c) {
                    var f = c.plotY,
                        g = o(c.yBottom, z),
                        h = c.plotX + w,
                        i = wa(O(f, g)),
                        j = wa(y(f, g) - i),
                        k = a.yAxis.stacks[(c.y < 0 ? "-" : "") + a.stackKey];
                    d && a.visible && k && k[c.x] && k[c.x].setOffset(w, s);
                    L(j) < v && v && (j = v, i = L(i - z) > v ? g - v : z - (f <= z ? v : 0));
                    c.barX = h;
                    c.pointWidth = q;
                    c.shapeType = "rect";
                    c.shapeArgs = f = b.renderer.Element.prototype.crisp.call(0, e, h, i, s, j);
                    e % 2 && (f.y -= 1, f.height += 1);
                    c.trackerArgs = L(j) < 3 && A(c.shapeArgs, {
                        height: 6,
                        y: i - 3
                    })
                })
            },
            getSymbol: ya,
            drawLegendSymbol: G.prototype.drawLegendSymbol,
            drawGraph: ya,
            drawPoints: function() {
                var a = this,
                    b = a.options,
                    c = a.chart.renderer,
                    d;
                n(a.points, function(e) {
                    var f = e.plotY,
                        g = e.graphic;
                    if(f !== x && !isNaN(f) && e.y !== null) d = e.shapeArgs, g ? (eb(g), g.animate(A(d))) : e.graphic = c[e.shapeType](d).attr(e.pointAttr[e.selected ? "select" : ""]).add(a.group).shadow(b.shadow, null, b.stacking && !b.borderRadius);
                    else if(g) e.graphic = g.destroy()
                })
            },
            drawTracker: function() {
                var a = this,
                    b = a.chart,
                    c = b.renderer,
                    d, e, f = +new Date,
                    g = a.options,
                    h = g.cursor,
                    i = h && {
                        cursor: h
                    },
                    j = a.isCartesian && a.plotGroup("trackerGroup", null, "visible", g.zIndex || 1, b.trackerGroup),
                    k, l, m;
                n(a.points, function(h) {
                    e = h.tracker;
                    d = h.trackerArgs || h.shapeArgs;
                    l = h.plotY;
                    m = !a.isCartesian || l !== x && !isNaN(l);
                    delete d.strokeWidth;
                    if(h.y !== null && m) e ? e.attr(d) : h.tracker = c[h.shapeType](d).attr({
                        isTracker: f,
                        fill: wb,
                        visibility: a.visible ? "visible" : "hidden"
                    }).on(fa ? "touchstart" : "mouseover", function(c) {
                        k = c.relatedTarget || c.fromElement;
                        if(b.hoverSeries !== a && z(k, "isTracker") !== f) a.onMouseOver();
                        h.onMouseOver()
                    }).on("mouseout", function(b) {
                        if(!g.stickyTracking && (k = b.relatedTarget || b.toElement, z(k, "isTracker") !== f)) a.onMouseOut()
                    }).css(i).add(h.group || j)
                })
            },
            alignDataLabel: function(a, b, c, d, e) {
                var f = this.chart,
                    g = f.inverted,
                    h = a.below || a.plotY > (this.translatedThreshold || f.plotSizeY),
                    i = this.options.stacking || c.inside;
                if(a.shapeArgs && (d = A(a.shapeArgs), g && (d = {
                    x: f.plotWidth - d.y - d.height,
                    y: f.plotHeight - d.x - d.width,
                    width: d.height,
                    height: d.width
                }), !i)) g ? (d.x += h ? 0 : d.width, d.width = 0) : (d.y += h ? d.height : 0, d.height = 0);
                c.align = o(c.align, !g || i ? "center" : h ? "right" : "left");
                c.verticalAlign = o(c.verticalAlign, g || i ? "middle" : h ? "top" : "bottom");
                N.prototype.alignDataLabel.call(this, a, b, c, d, e)
            },
            animate: function(a) {
                var b = this,
                    c = b.points,
                    d = b.options;
                if(!a) n(c, function(a) {
                    var c = a.graphic,
                        a = a.shapeArgs,
                        g = b.yAxis,
                        h = d.threshold;
                    c && (c.attr({
                        height: 0,
                        y: t(h) ? g.getThreshold(h) : g.translate(g.getExtremes().min, 0, 1, 0, 1)
                    }), c.animate({
                        height: a.height,
                        y: a.y
                    }, d.animation))
                }), b.animate = null
            },
            remove: function() {
                var a = this,
                    b = a.chart;
                b.hasRendered && n(b.series, function(b) {
                    if(b.type === a.type) b.isDirty = !0
                });
                N.prototype.remove.apply(a, arguments)
            }
        });
        $.column = ha;
        W.bar = A(W.column);
        za = ca(ha, {
            type: "bar",
            inverted: !0
        });
        $.bar = za;
        W.scatter = A(ga, {
            lineWidth: 0,
            states: {
                hover: {
                    lineWidth: 0
                }
            },
            tooltip: {
                headerFormat: '<span style="font-size: 10px; color:{series.color}">{series.name}</span><br/>',
                pointFormat: "x: <b>{point.x}</b><br/>y: <b>{point.y}</b><br/>"
            }
        });
        za = ca(N, {
            type: "scatter",
            sorted: !1,
            translate: function() {
                var a = this;
                N.prototype.translate.apply(a);
                n(a.points, function(b) {
                    b.shapeType = "circle";
                    b.shapeArgs = {
                        x: b.plotX,
                        y: b.plotY,
                        r: a.chart.options.tooltip.snap
                    }
                })
            },
            drawTracker: function() {
                for(var a = this, b = a.options.cursor, b = b && {
                    cursor: b
                }, c = a.points, d = c.length, e; d--;)
                if(e = c[d].graphic) e.element._i = d;
                a._hasTracking ? a._hasTracking = !0 : a.markerGroup.attr({
                    isTracker: !0
                }).on(fa ? "touchstart" : "mouseover", function(b) {
                    a.onMouseOver();
                    if(b.target._i !== x) c[b.target._i].onMouseOver()
                }).on("mouseout", function() {
                    if(!a.options.stickyTracking) a.onMouseOut()
                }).css(b)
            }
        });
        $.scatter = za;
        W.pie = A(ga, {
            borderColor: "#FFFFFF",
            borderWidth: 1,
            center: ["50%", "50%"],
            colorByPoint: !0,
            dataLabels: {
                distance: 30,
                enabled: !0,
                formatter: function() {
                    return this.point.name
                }
            },
            legendType: "point",
            marker: null,
            size: "75%",
            showInLegend: !1,
            slicedOffset: 10,
            states: {
                hover: {
                    brightness: 0.1,
                    shadow: !1
                }
            }
        });
        ya = {
            type: "pie",
            isCartesian: !1,
            pointClass: ca(Ta, {
                init: function() {
                    Ta.prototype.init.apply(this, arguments);
                    var a = this,
                        b;
                    r(a, {
                        visible: a.visible !== !1,
                        name: o(a.name, "Slice")
                    });
                    b = function() {
                        a.slice()
                    };
                    I(a, "select", b);
                    I(a, "unselect", b);
                    return a
                },
                setVisible: function(a) {
                    var b = this.series,
                        c = b.chart,
                        d = this.tracker,
                        e = this.dataLabel,
                        f = this.connector,
                        g = this.shadowGroup,
                        h;
                    h = (this.visible = a = a === x ? !this.visible : a) ? "show" : "hide";
                    this.group[h]();
                    if(d) d[h]();
                    if(e) e[h]();
                    if(f) f[h]();
                    if(g) g[h]();
                    this.legendItem && c.legend.colorizeItem(this, a);
                    if(!b.isDirty && b.options.ignoreHiddenPoint) b.isDirty = !0, c.redraw()
                },
                slice: function(a, b, c) {
                    var d = this.series.chart,
                        e = this.slicedTranslation;
                    ua(c, d);
                    o(b, !0);
                    a = this.sliced = t(a) ? a : !this.sliced;
                    a = {
                        translateX: a ? e[0] : d.plotLeft,
                        translateY: a ? e[1] : d.plotTop
                    };
                    this.group.animate(a);
                    this.shadowGroup && this.shadowGroup.animate(a)
                }
            }),
            pointAttrToOptions: {
                stroke: "borderColor",
                "stroke-width": "borderWidth",
                fill: "color"
            },
            getColor: function() {
                this.initialColor = this.chart.counters.color
            },
            animate: function() {
                var a = this;
                n(a.points, function(b) {
                    var c = b.graphic,
                        b = b.shapeArgs,
                        d = -xa / 2;
                    c && (c.attr({
                        r: 0,
                        start: d,
                        end: d
                    }), c.animate({
                        r: b.r,
                        start: b.start,
                        end: b.end
                    }, a.options.animation))
                });
                a.animate = null
            },
            setData: function(a, b) {
                N.prototype.setData.call(this, a, !1);
                this.processData();
                this.generatePoints();
                o(b, !0) && this.chart.redraw()
            },
            getCenter: function() {
                var a = this.options,
                    b = this.chart,
                    c = b.plotWidth,
                    d = b.plotHeight,
                    a = a.center.concat([a.size, a.innerSize || 0]),
                    e = O(c, d),
                    f;
                return Sa(a, function(a, b) {
                    return(f = /%$/.test(a)) ? [c, d, e, e][b] * w(a) / 100 : a
                })
            },
            translate: function() {
                this.generatePoints();
                var a = 0,
                    b = -0.25,
                    c = this.options,
                    d = c.slicedOffset,
                    e = d + c.borderWidth,
                    f, g = this.chart,
                    h, i, j, k = this.points,
                    l = 2 * xa,
                    m = c.dataLabels.distance,
                    o = c.ignoreHiddenPoint,
                    n, r = k.length,
                    q;
                this.center = f = this.getCenter();
                this.getX = function(a, b) {
                    j = J.asin((a - f[1]) / (f[2] / 2 + m));
                    return f[0] + (b ? -1 : 1) * V(j) * (f[2] / 2 + m)
                };
                for(n = 0; n < r; n++)
                q = k[n], a += o && !q.visible ? 0 : q.y;
                for(n = 0; n < r; n++) {
                    q = k[n];
                    c = a ? q.y / a : 0;
                    h = s(b * l * 1E3) / 1E3;
                    if(!o || q.visible) b += c;
                    i = s(b * l * 1E3) / 1E3;
                    q.shapeType = "arc";
                    q.shapeArgs = {
                        x: f[0],
                        y: f[1],
                        r: f[2] / 2,
                        innerR: f[3] / 2,
                        start: h,
                        end: i
                    };
                    j = (i + h) / 2;
                    q.slicedTranslation = Sa([V(j) * d + g.plotLeft, Y(j) * d + g.plotTop], s);
                    h = V(j) * f[2] / 2;
                    i = Y(j) * f[2] / 2;
                    q.tooltipPos = [f[0] + h * 0.7, f[1] + i * 0.7];
                    q.labelPos = [f[0] + h + V(j) * m, f[1] + i + Y(j) * m, f[0] + h + V(j) * e, f[1] + i + Y(j) * e, f[0] + h, f[1] + i, m < 0 ? "center" : j < l / 4 ? "left" : "right", j];
                    q.percentage = c * 100;
                    q.total = a
                }
                this.setTooltipPoints()
            },
            render: function() {
                this.getAttribs();
                this.drawPoints();
                this.options.enableMouseTracking !== !1 && this.drawTracker();
                this.drawDataLabels();
                this.options.animation && this.animate && this.animate();
                this.isDirty = !1
            },
            drawPoints: function() {
                var a = this,
                    b = a.chart,
                    c = b.renderer,
                    d, e, f, g = a.options.shadow,
                    h, i;
                n(a.points, function(j) {
                    e = j.graphic;
                    i = j.shapeArgs;
                    f = j.group;
                    h = j.shadowGroup;
                    if(g && !h) h = j.shadowGroup = c.g("shadow").attr({
                        zIndex: 4
                    }).add();
                    if(!f) f = j.group = c.g("point").attr({
                        zIndex: 5
                    }).add();
                    d = j.sliced ? j.slicedTranslation : [b.plotLeft, b.plotTop];
                    f.translate(d[0], d[1]);
                    h && h.translate(d[0], d[1]);
                    e ? e.animate(i) : j.graphic = e = c.arc(i).setRadialReference(a.center).attr(r(j.pointAttr[""], {
                        "stroke-linejoin": "round"
                    })).add(j.group).shadow(g, h);
                    j.visible === !1 && j.setVisible(!1)
                })
            },
            drawDataLabels: function() {
                var a = this.data,
                    b, c = this.chart,
                    d = this.options.dataLabels,
                    e = o(d.connectorPadding, 10),
                    f = o(d.connectorWidth, 1),
                    g, h, i = o(d.softConnector, !0),
                    j = d.distance,
                    k = this.center,
                    l = k[2] / 2,
                    m = k[1],
                    p = j > 0,
                    r = [
                        [],
                        []
                    ],
                    s, q, t, w, y = 2,
                    v;
                if(d.enabled || this._hasPointLabels) {
                    N.prototype.drawDataLabels.apply(this);
                    n(a, function(a) {
                        a.dataLabel && r[a.labelPos[7] < xa / 2 ? 0 : 1].push(a)
                    });
                    r[1].reverse();
                    w = function(a, b) {
                        return b.y - a.y
                    };
                    for(a = r[0][0] && r[0][0].dataLabel && (r[0][0].dataLabel.getBBox().height || 21); y--;) {
                        var x = [],
                            A = [],
                            z = r[y],
                            C = z.length,
                            B;
                        if(j > 0) {
                            for(v = m - l - j; v <= m + l + j; v += a)
                            x.push(v);
                            t = x.length;
                            if(C > t) {
                                h = [].concat(z);
                                h.sort(w);
                                for(v = C; v--;)
                                h[v].rank = v;
                                for(v = C; v--;)
                                z[v].rank >= t && z.splice(v, 1);
                                C = z.length
                            }
                            for(v = 0; v < C; v++) {
                                b = z[v];
                                h = b.labelPos;
                                b = 9999;
                                for(q = 0; q < t; q++)
                                g = L(x[q] - h[1]), g < b && (b = g, B = q);
                                if(B < v && x[v] !== null) B = v;
                                else for(t < C - v + B && x[v] !== null && (B = t - C + v); x[B] === null;)
                                B++;
                                A.push({
                                    i: B,
                                    y: x[B]
                                });
                                x[B] = null
                            }
                            A.sort(w)
                        }
                        for(v = 0; v < C; v++) {
                            b = z[v];
                            h = b.labelPos;
                            g = b.dataLabel;
                            t = b.visible === !1 ? "hidden" : "visible";
                            s = h[1];
                            if(j > 0) {
                                if(q = A.pop(), B = q.i, q = q.y, s > q && x[B + 1] !== null || s < q && x[B - 1] !== null) q = s
                            } else q = s;
                            s = d.justify ? k[0] + (y ? -1 : 1) * (l + j) : this.getX(B === 0 || B === x.length - 1 ? s : q, y);
                            g.attr({
                                visibility: t,
                                align: h[6]
                            })[g.moved ? "animate" : "attr"]({
                                x: s + d.x + ({
                                    left: e,
                                    right: -e
                                }[h[6]] || 0),
                                y: q + d.y - 10
                            });
                            g.moved = !0;
                            if(p && f) g = b.connector, h = i ? ["M", s + (h[6] === "left" ? 5 : -5), q, "C", s, q, 2 * h[2] - h[4], 2 * h[3] - h[5], h[2], h[3], "L", h[4], h[5]] : ["M", s + (h[6] === "left" ? 5 : -5), q, "L", h[2], h[3], "L", h[4], h[5]], g ? (g.animate({
                                d: h
                            }), g.attr("visibility", t)) : b.connector = g = this.chart.renderer.path(h).attr({
                                "stroke-width": f,
                                stroke: d.connectorColor || b.color || "#606060",
                                visibility: t,
                                zIndex: 3
                            }).translate(c.plotLeft, c.plotTop).add()
                        }
                    }
                }
            },
            alignDataLabel: ya,
            drawTracker: ha.prototype.drawTracker,
            drawLegendSymbol: G.prototype.drawLegendSymbol,
            getSymbol: function() {}
        };
        ya = ca(N, ya);
        $.pie = ya;
        r(Highcharts, {
            Axis: ob,
            CanVGRenderer: gb,
            Chart: sb,
            Color: qa,
            Legend: rb,
            MouseTracker: qb,
            Point: Ta,
            Tick: Pa,
            Tooltip: pb,
            Renderer: Ra,
            Series: N,
            SVGRenderer: ra,
            VMLRenderer: ja,
            dateFormat: cb,
            pathAnim: vb,
            getOptions: function() {
                return M
            },
            hasBidiBug: Pb,
            numberFormat: Ia,
            seriesTypes: $,
            setOptions: function(a) {
                M = A(M, a);
                Gb();
                return M
            },
            addEvent: I,
            removeEvent: S,
            createElement: Q,
            discardElement: Na,
            css: H,
            each: n,
            extend: r,
            map: Sa,
            merge: A,
            pick: o,
            splat: na,
            extendClass: ca,
            pInt: w,
            wrap: function(a, b, c) {
                var d = a[b];
                a[b] = function() {
                    var a = Array.prototype.slice.call(arguments);
                    a.unshift(d);
                    return c.apply(this, a)
                }
            },
            svg: Z,
            canvas: U,
            vml: !Z && !U,
            product: "Highcharts",
            version: "2.3.3"
        })
    })();
    return function(elm, hname, date, price, d) {
        if(typeof(date) == "undefined" || typeof(price) == "undefined" || date.length == 0 || price.length == 0) return;
        chart = new Highcharts.Chart({
            chart: {
                renderTo: elm,
                type: 'line',
                marginRight: 0,
                marginBottom: 30,
                plotBorderWidth: 2
            },
            credits: {
                enabled: false
            },
            title: {
                enabled: false,
                text: '',
                x: 0
            },
            xAxis: {
                gridLineWidth: 1,
                gridLineColor: '#EEEEEE',
                min: 0,
                categories: date
            },
            yAxis: {
                title: {
                    text: '单位(' + d + ')',
                    style: 'color:#fff;'
                }
            },
            tooltip: {
                formatter: function() {
                    return '<b>' + this.series.name + this.x + '</b><br/>' + this.y + d;
                }
            },
            legend: {
                layout: 'vertical',
                align: 'right',
                verticalAlign: 'top',
                color: '#FF0000',
                x: -20,
                y: 100,
                borderWidth: 1
            },
            series: [{
                showInLegend: false,
                color: '#FF9900',
                name: hname,
                data: price
            }]
        });
    }
});